配色: 字号:
javaweb——Filter(过滤器)常见应用
2016-08-22 | 阅:  转:  |  分享 
  
javaweb——Filter(过滤器)常见应用



一、统一全站字符编码



通过配置参数charset指明使用何种字符编码,以处理HtmlForm请求参数的中文问题



复制代码

1packageme.gacl.web.filter;

2

3importjava.io.IOException;

4importjavax.servlet.Filter;

5importjavax.servlet.FilterChain;

6importjavax.servlet.FilterConfig;

7importjavax.servlet.ServletException;

8importjavax.servlet.ServletRequest;

9importjavax.servlet.ServletResponse;

10importjavax.servlet.http.HttpServletRequest;

11importjavax.servlet.http.HttpServletRequestWrapper;

12importjavax.servlet.http.HttpServletResponse;

13

14/

15@ClassName:CharacterEncodingFilter

16@Description:此过滤器用来解决全站中文乱码问题

17@author:孤傲苍狼

18@date:2014-8-31下午11:09:37

19

20/

21publicclassCharacterEncodingFilterimplementsFilter{

22

23privateFilterConfigfilterConfig=null;

24//设置默认的字符编码

25privateStringdefaultCharset="UTF-8";

26

27publicvoiddoFilter(ServletRequestreq,ServletResponseresp,

28FilterChainchain)throwsIOException,ServletException{

29

30HttpServletRequestrequest=(HttpServletRequest)req;

31HttpServletResponseresponse=(HttpServletResponse)resp;

32Stringcharset=filterConfig.getInitParameter("charset");

33if(charset==null){

34charset=defaultCharset;

35}

36request.setCharacterEncoding(charset);

37response.setCharacterEncoding(charset);

38response.setContentType("text/html;charset="+charset);

39

40MyCharacterEncodingRequestrequestWrapper=newMyCharacterEncodingRequest(request);

41chain.doFilter(requestWrapper,response);

42}

43

44publicvoidinit(FilterConfigfilterConfig)throwsServletException{

45//得到过滤器的初始化配置信息

46this.filterConfig=filterConfig;

47}

48

49publicvoiddestroy(){

50

51}

52}

53

54/

551.实现与被增强对象相同的接口

562、定义一个变量记住被增强对象

573、定义一个构造器,接收被增强对象

584、覆盖需要增强的方法

595、对于不想增强的方法,直接调用被增强对象(目标对象)的方法

60/

61

62classMyCharacterEncodingRequestextendsHttpServletRequestWrapper{

63

64privateHttpServletRequestrequest;

65publicMyCharacterEncodingRequest(HttpServletRequestrequest){

66super(request);

67this.request=request;

68}

69/重写getParameter方法

70@seejavax.servlet.ServletRequestWrapper#getParameter(java.lang.String)

71/

72@Override

73publicStringgetParameter(Stringname){

74

75try{

76//获取参数的值

77Stringvalue=this.request.getParameter(name);

78if(value==null){

79returnnull;

80}

81//如果不是以get方式提交数据的,就直接返回获取到的值

82if(!this.request.getMethod().equalsIgnoreCase("get")){

83returnvalue;

84}else{

85//如果是以get方式提交数据的,就对获取到的值进行转码处理

86value=newString(value.getBytes("ISO8859-1"),this.request.getCharacterEncoding());

87returnvalue;

88}

89}catch(Exceptione){

90thrownewRuntimeException(e);

91}

92}

93}

复制代码

web.xml文件中的配置如下:



复制代码

1

2CharacterEncodingFilter

3me.gacl.web.filter.CharacterEncodingFilter

4

5charset

6UTF-8

7


8


9

10

11CharacterEncodingFilter

12/

13


复制代码

二、禁止浏览器缓存所有动态页面



有3个HTTP响应头字段都可以禁止浏览器缓存当前页面,它们在Servlet中的示例代码如下:



1response.setDateHeader("Expires",-1);

2response.setHeader("Cache-Control","no-cache");

3response.setHeader("Pragma","no-cache");

并不是所有的浏览器都能完全支持上面的三个响应头,因此最好是同时使用上面的三个响应头。



Expires数据头:值为GMT时间值,为-1指浏览器不要缓存页面

Cache-Control响应头有两个常用值:

no-cache指浏览器不要缓存当前页面。

max-age:xxx指浏览器缓存页面xxx秒。

复制代码

1packageme.gacl.web.filter;

2

3importjava.io.IOException;

4

5importjavax.servlet.Filter;

6importjavax.servlet.FilterChain;

7importjavax.servlet.FilterConfig;

8importjavax.servlet.ServletException;

9importjavax.servlet.ServletRequest;

10importjavax.servlet.ServletResponse;

11importjavax.servlet.http.HttpServletRequest;

12importjavax.servlet.http.HttpServletResponse;

13

14/

15@ClassName:NoCacheFilter

16@Description:禁止浏览器缓存所有动态页面

17@author:孤傲苍狼

18@date:2014-8-31下午11:25:40

19

20/

21publicclassNoCacheFilterimplementsFilter{

22

23

24publicvoiddoFilter(ServletRequestreq,ServletResponseresp,

25FilterChainchain)throwsIOException,ServletException{

26//把ServletRequest强转成HttpServletRequest

27HttpServletRequestrequest=(HttpServletRequest)req;

28//把ServletResponse强转成HttpServletResponse

29HttpServletResponseresponse=(HttpServletResponse)resp;

30//禁止浏览器缓存所有动态页面

31response.setDateHeader("Expires",-1);

32response.setHeader("Cache-Control","no-cache");

33response.setHeader("Pragma","no-cache");

34

35chain.doFilter(request,response);

36}

37

38publicvoidinit(FilterConfigfilterConfig)throwsServletException{

39

40}

41

42publicvoiddestroy(){

43

44}

45}

复制代码

web.xml文件中的配置如下:



复制代码

1

2NoCacheFilter

3me.gacl.web.filter.NoCacheFilter

4


5

6

7NoCacheFilter

8

9.jsp

10


复制代码

三、控制浏览器缓存页面中的静态资源



有些动态页面中引用了一些图片或css文件以修饰页面效果,这些图片和css文件经常是不变化的,所以为减轻服务器的压力,可以使用filter控制浏览器缓存这些文件,以提升服务器的性能。



复制代码

1packageme.gacl.web.filter;

2

3importjava.io.IOException;

4

5importjavax.servlet.Filter;

6importjavax.servlet.FilterChain;

7importjavax.servlet.FilterConfig;

8importjavax.servlet.ServletException;

9importjavax.servlet.ServletRequest;

10importjavax.servlet.ServletResponse;

11importjavax.servlet.http.HttpServletRequest;

12importjavax.servlet.http.HttpServletResponse;

13

14/

15@ClassName:CacheFilter

16@Description:控制缓存的filter

17@author:孤傲苍狼

18@date:2014-9-1下午9:39:38

19

20/

21publicclassCacheFilterimplementsFilter{

22

23privateFilterConfigfilterConfig;

24

25publicvoiddoFilter(ServletRequestreq,ServletResponseresp,

26FilterChainchain)throwsIOException,ServletException{

27

28HttpServletRequestrequest=(HttpServletRequest)req;

29HttpServletResponseresponse=(HttpServletResponse)resp;

30

31//1.获取用户想访问的资源

32Stringuri=request.getRequestURI();

33

34//2.得到用户想访问的资源的后缀名

35Stringext=uri.substring(uri.lastIndexOf(".")+1);

36

37//得到资源需要缓存的时间

38Stringtime=filterConfig.getInitParameter(ext);

39if(time!=null){

40longt=Long.parseLong(time)36001000;

41//设置缓存

42response.setDateHeader("expires",System.currentTimeMillis()+t);

43}

44

45chain.doFilter(request,response);

46

47}

48

49publicvoidinit(FilterConfigfilterConfig)throwsServletException{

50this.filterConfig=filterConfig;

51}

52

53publicvoiddestroy(){

54

55}

56}

复制代码

web.xml文件中的配置如下:



复制代码

1

2

3CacheFilter

4me.gacl.web.filter.CacheFilter

5

6

7css

84

9


10

11jpg

121

13


14

15js

164

17


18

19png

204

21


22


23

24

25CacheFilter

26.jpg

27


28

29

30CacheFilter

31.css

32


33

34

35CacheFilter

36.js

37


38

39CacheFilter

40.png

41


复制代码

四、实现用户自动登陆



思路是这样的:



1、在用户登陆成功后,发送一个名称为user的cookie给客户端,cookie的值为用户名和md5加密后的密码。

2、编写一个AutoLoginFilter,这个filter检查用户是否带有名称为user的cookie来,如果有,则调用dao查询cookie的用户名和密码是否和数据库匹配,匹配则向session中存入user对象(即用户登陆标记),以实现程序完成自动登陆。



核心代码如下:



处理用户登录的控制器:LoginServlet



复制代码

1packageme.gacl.web.controller;

2

3importjava.io.IOException;

4

5importjavax.servlet.ServletException;

6importjavax.servlet.http.Cookie;

7importjavax.servlet.http.HttpServlet;

8importjavax.servlet.http.HttpServletRequest;

9importjavax.servlet.http.HttpServletResponse;

10

11importme.gacl.dao.UserDao;

12importme.gacl.domain.User;

13importme.gacl.util.WebUtils;

14

15publicclassLoginServletextendsHttpServlet{

16

17publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)

18throwsServletException,IOException{

19

20Stringusername=request.getParameter("username");

21Stringpassword=request.getParameter("password");

22

23UserDaodao=newUserDao();

24Useruser=dao.find(username,password);

25if(user==www.wang027.comnull){

26request.setAttribute("message","用户名或密码不对!!");

27request.getRequestDispatcher("/message.jsp").forward(request,response);

28return;

29}

30request.getSession().setAttribute("user",user);

31//发送自动登陆cookie给客户端浏览器进行存储

32sendAutoLoginCookie(request,response,user);

33request.getRequestDispatcher("/index.jsp").forward(request,response);

34}

35

36/

37@Method:sendAutoLoginCookie

38@Description:发送自动登录cookie给客户端浏览器

39@Anthor:孤傲苍狼

40

41@paramrequest

42@paramresponse

43@paramuser

44/

45privatevoidsendAutoLoginCookie(HttpServletRequestrequest,HttpServletResponseresponse,Useruser){

46if(request.getParameter("logintime")!=null){

47intlogintime=Integer.parseInt(request.getParameter("logintime"));

48//创建cookie,cookie的名字是autologin,值是用户登录的用户名和密码,用户名和密码之间使用.进行分割,密码经过md5加密处理

49Cookiecookie=newCookie("autologin",user.getUsername()+"."+WebUtils.md5(user.getPassword()));

50//设置cookie的有效期

51cookie.setMaxAge(logintime);

52//设置cookie的有效路径

53cookie.setPath(request.getContextPath());

54//将cookie写入到客户端浏览器

55response.addCookie(cookie);

56}

57}

58

59publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)

60throwsServletException,IOException{

61

62doGet(request,response);

63}

64

65}

复制代码

处理用户自动登录的过滤器:AutoLoginFilter



复制代码

1packageme.gacl.web.filter;

2

3importjava.io.IOException;

4

5importjavax.servlet.Filter;

6importjavax.servlet.FilterChain;

7importjavax.servlet.FilterConfig;

8importjavax.servlet.ServletException;

9importjavax.servlet.ServletRequest;

10importjavax.servlet.ServletResponse;

11importjavax.servlet.http.Cookie;

12importjavax.servlet.http.HttpServletRequest;

13importjavax.servlet.http.HttpServletResponse;

14

15importme.gacl.dao.UserDao;

16importme.gacl.domain.User;

17importme.gacl.util.WebUtils;

18

19publicclassAutoLoginFilterimplementsFilter{

20

21publicvoiddoFilter(ServletRequestreq,ServletResponseresp,

22FilterChainchain)throwsIOException,ServletException{

23

24HttpServletRequestrequest=(HttpServletRequest)req;

25HttpServletResponseresponse=(HttpServletResponse)resp;

26//如果已经登录了,就直接chain.doFilter(request,response)放行

27if(request.getSession().getAttribute("user")!=null){

28chain.doFilter(request,response);

29return;

30}

31

32//1.得到用户带过来的authlogin的cookie

33Stringvalue=null;

34Cookiecookies[]=request.getCookies();

35for(inti=0;cookies!=null&&i
36if(cookies[i].getName().equals("autologin")){

37value=cookies[i].getValue();

38}

39}

40

41//2.得到cookie中的用户名和密码

42if(value!=null){

43Stringusername=value.split("\\.")[0];

44Stringpassword=value.split("\\.")[1];

45

46//3.调用dao获取用户对应的密码

47UserDaodao=newUserDao();

48Useruser=dao.find(username);

49Stringdbpassword=user.getPassword();

50

51//4.检查用户带过来的md5的密码和数据库中的密码是否匹配,如匹配则自动登陆

52if(password.equals(WebUtils.md5(dbpassword))){

53request.getSession().setAttribute("user",user);

54}

55}

56

57chain.doFilter(request,response);

58}

59

60publicvoiddestroy(){

61

62}

63

64publicvoidinit(FilterConfigfilterConfig)throwsServletException{

65

66}

67}

复制代码

如果想取消自动登录,那么可以在用户注销时删除自动登录cookie,核心代码如下:



复制代码

1packageme.gacl.web.controller;

2

3importjava.io.IOException;

4

5importjavax.servlet.ServletException;

6importjavax.servlet.http.Cookie;

7importjavax.servlet.http.HttpServlet;

8importjavax.servlet.http.HttpServletRequest;

9importjavax.servlet.http.HttpServletResponse;

10

11publicclassCancelAutoLoginServletextendsHttpServlet{

12

13publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)

14throwsServletException,IOException{

15//移除存储在session中的user

16request.getSession().removeAttribute("user");

17//移除自动登录的cookie

18removeAutoLoginCookie(request,response);

19//注销用户后跳转到登录页面

20request.getRequestDispatcher("/login.jsp").forward(request,response);

21}

22

23/

24@Method:removeAutoLoginCookie

25@Description:删除自动登录cookie,

26JavaWeb中删除cookie的方式就是新创建一个cookie,新创建的cookie与要删除的cookie同名,

27设置新创建的cookie的cookie的有效期设置为0,有效路径与要删除的cookie的有效路径相同

28@Anthor:孤傲苍狼

29

30@paramrequest

31@paramresponse

32/

33privatevoidremoveAutoLoginCookie(HttpServletRequestrequest,HttpServletResponseresponse){

34//创建一个名字为autologin的cookie

35Cookiecookie=newCookie("autologin","");

36//将cookie的有效期设置为0,命令浏览器删除该cookie

37cookie.setMaxAge(0);

38//设置要删除的cookie的path

39cookie.setPath(request.getContextPath());

40response.addCookie(cookie);

41}

42

43publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)

44throwsServletException,IOException{

45doGet(request,response);

46}

47}



献花(0)
+1
(本文系thedust79首藏)