杂记(一):Listener、Filter和工具
来源:互联网 发布:武汉专业淘宝摄影 编辑:程序博客网 时间:2024/06/04 14:21
绪论
杂七杂八,瞎记一下。
一、Listener、Filter和Servlet
虽然Listener、Filter、Servlet都可以在web.xml中进行配置,但是它们加载有先后顺序(Listener –> Filter –> Servlet)。
- Listener:简单来说就是监听,当。。。开始执行之前先执行它。
- Filter:基本上用来处理用户的请求,比如:判断当前用户有没有登录、访问路径有没有权限、对访问路径进行修改等。
- Servlet:主要是对请求进行处理,并且返回处理结果,也就是控制层。
二、ServletContextListener接口
由于该监听事件在项目一起动时就执行,可用来处理初始化数据库、系统配置等等。
web.xml配置访问文件
<listener> <listener-class>com.zDemo.WebContextListener</listener-class></listener>
ServletContextListener接口的实现类
package com.zDemo;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;public class WebContextListener implements ServletContextListener{ /** * 销毁方法 */ @Override public void contextDestroyed(ServletContextEvent arg0) { System.out.println("销毁方法"); } /** * 初始化方法 */ @Override public void contextInitialized(ServletContextEvent arg0) { System.out.println("初始化方法"); }}
运行结果:
三、Filter接口
web.xml配置访问文件
<!-- 配置过滤器 --><filter> <filter-name>LoginFilter</filter-name> <filter-class>com.zDemo.LoginFilter</filter-class> <init-param> <param-name>logonStrings</param-name><!-- 对登录页面不进行过滤 --> <param-value>login.jsp;login.do</param-value> </init-param> <init-param> <param-name>includeStrings</param-name><!-- 只对指定过滤参数后缀进行过滤 --> <param-value>.do;.jsp</param-value> </init-param> <init-param> <param-name>redirectPath</param-name><!-- 未通过跳转到登录界面 --> <param-value>/index.jsp</param-value> </init-param> <init-param> <param-name>disabletestfilter</param-name><!-- Y:过滤无效 --> <param-value>N</param-value> </init-param></filter><filter-mapping> <filter-name>LoginFilter</filter-name> <url-pattern>/*</url-pattern></filter-mapping>
Filter接口的实现类
package com.zDemo;import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;public class LoginFilter implements Filter{ @Override public void destroy() { System.out.println("Filter销毁"); } @Override public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { HttpServletRequest servletRequest = (HttpServletRequest) request; HttpServletResponse servletResponse = (HttpServletResponse) response; // 获取访问地址 String path = servletRequest.getRequestURI(); System.out.println(path); filterChain.doFilter(servletRequest, servletResponse); } @Override public void init(FilterConfig arg0) throws ServletException { System.out.println("Filter开始"); }}
运行结果:
四、区分PC端或者是移动端登录
LoginFilter文件内容
package com.zDemo;import java.io.IOException;import java.util.Date;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class LoginFilter implements Filter{ private FilterConfig config; @Override public void destroy() { System.out.println("Filter销毁"); this.config = null; } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { // 获取session HttpServletRequest servletRequest = (HttpServletRequest) request; HttpServletResponse servletResponse = (HttpServletResponse) response; // 记录日志 /*ServletContext context = this.config.getServletContext(); // 获取访问地址 String path = servletRequest.getRequestURI(); context.log("请求地址:" + path + " || 时间:" + UtilsClass.dateString(new Date())); System.out.println(path);*/ UtilsClass.check(servletRequest, servletResponse); filterChain.doFilter(servletRequest, servletResponse); } @Override public void init(FilterConfig config) throws ServletException { System.out.println("Filter开始"); this.config = config; }}
UtilsClass工具类内容,判断登录设备
package com.zDemo;import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Date;import java.util.regex.Matcher;import java.util.regex.Pattern;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class UtilsClass { // \b 是单词边界(连着的两个(字母字符 与 非字母字符) 之间的逻辑上的间隔), // 字符串在编译时会被转码一次,所以是 "\\b" // \B 是单词内部逻辑间隔(连着的两个字母字符之间的逻辑上的间隔) static String phoneReg = "\\b(ip(hone|od)|android|opera m(ob|in)i" +"|windows (phone|ce)|blackberry" +"|s(ymbian|eries60|amsung)|p(laybook|alm|rofile/midp" +"|laystation portable)|nokia|fennec|htc[-_]" +"|mobile|up.browser|[1-4][0-9]{2}x[1-4][0-9]{2})\\b"; static String tableReg = "\\b(ipad|tablet|(Nexus 7)|up.browser" +"|[1-4][0-9]{2}x[1-4][0-9]{2})\\b"; //移动设备正则匹配:手机端、平板 static Pattern phonePat = Pattern.compile(phoneReg, Pattern.CASE_INSENSITIVE); static Pattern tablePat = Pattern.compile(tableReg, Pattern.CASE_INSENSITIVE); /** * 检测是否是移动设备访问 * @param request * @param response */ public static void check(HttpServletRequest request, HttpServletResponse response){ boolean isMobile = false; // userAgent 浏览器标识 String userAgent = request.getHeader("USER-AGENT").toLowerCase(); if (null == userAgent) { userAgent = ""; } // 匹配 Matcher matcherPhone = phonePat.matcher(userAgent); Matcher matcherTable = tablePat.matcher(userAgent); if(matcherPhone.find() || matcherTable.find()){ isMobile = true; } // 获取访问地址 String path = request.getRequestURI(); if(isMobile){ System.out.println("移动端访问 访问方法:" + path + " 时间:"+ dateString(new Date())); }else{ System.out.println("电脑端访问 访问方法:" + path + " 时间:"+ dateString(new Date())); } } /** * 数据库日期毫秒数格式化 */ public static String dateString(Date date){ DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String str = format.format(date); return str; }}
运行结果:
五、谷歌坐标和百度坐标相互转换
static final double x_pi = 3.14159265358979324 * 3000.0 / 180.0;/** * 谷歌坐标转换成百度地图坐标 */public static double[] googleToBaiDu(double x, double y){ double[] d = new double[2]; double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi); double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi); d[0] = z * Math.cos(theta) + 0.0065; d[1] = z * Math.sin(theta) + 0.006; return d;}/** * 谷歌坐标转换成百度地图坐标 */public static double[] baiDuToGoogle(double x, double y){ x = x - 0.0065; y = y - 0.006; double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi); double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi); double[] d = new double[2]; d[0] = z * Math.cos(theta); d[1] = z * Math.sin(theta); return d;}
运行结果:
马马虎虎可以用,好像百度地图上已经有谷歌地图坐标转百度地图坐标的方法,建议使用。
(若有什么错误,请留言指正,3Q)
阅读全文
0 0
- 杂记(一):Listener、Filter和工具
- 过滤器(Filter)和监听器(Listener)
- 过滤器(Filter)和监听器(Listener)
- 过滤器(Filter)和监听器(listener)
- 过滤器(Filter)和监听器(Listener)
- Listener 、Filter 和 Interceptor
- filter和listener
- Servlet、Filter和Listener
- Filter和Listener
- Servlet、Filter和Listener
- Servlet、Filter和Listener
- Filter 和 Listener小结
- 11Listener和Filter
- Servlet-Filter和Listener
- JavaEE Filter和Listener
- Listener和Filter
- filter和listener
- servlet中的Listener和Filter
- 1.NHibernate
- 关于angularJS中的异步请求(转)
- 今天想测试下博客怎么玩呀呀呀呀呀
- Charles_技巧
- 在IDEA上用Weblogic运行Web程序的小记
- 杂记(一):Listener、Filter和工具
- 1 微服务实战系列
- 排序算法(二)——选择排序及改进
- leetcode_135. Candy ? 待解决
- C#获得C++字符串
- mongodb日志oplog解读
- css如何让两个并列的按钮 水平居中显示
- 利用dd命令制作ubuntu启动盘
- 深度优先搜索 迭代加深搜索 hdu 1560