您的位置:首页 > 其它

过滤器Filter典型应用

2016-01-05 15:30 513 查看

一、统一全站字符编码

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

<code class="hljs java has-numbering"><span class="hljs-keyword">package</span> me.gacl.web.filter;

<span class="hljs-keyword">import</span> java.io.IOException;
<span class="hljs-keyword">import</span> javax.servlet.Filter;
<span class="hljs-keyword">import</span> javax.servlet.FilterChain;
<span class="hljs-keyword">import</span> javax.servlet.FilterConfig;
<span class="hljs-keyword">import</span> javax.servlet.ServletException;
<span class="hljs-keyword">import</span> javax.servlet.ServletRequest;
<span class="hljs-keyword">import</span> javax.servlet.ServletResponse;
<span class="hljs-keyword">import</span> javax.servlet.http.HttpServletRequest;
<span class="hljs-keyword">import</span> javax.servlet.http.HttpServletRequestWrapper;
<span class="hljs-keyword">import</span> javax.servlet.http.HttpServletResponse;

<span class="hljs-javadoc">/**
*<span class="hljs-javadoctag"> @ClassName</span>: CharacterEncodingFilter
*<span class="hljs-javadoctag"> @Description</span>: 此过滤器用来解决全站中文乱码问题
*<span class="hljs-javadoctag"> @author</span>: 孤傲苍狼
*<span class="hljs-javadoctag"> @date</span>: 2014-8-31 下午11:09:37
*
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">CharacterEncodingFilter</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Filter</span> {</span>

<span class="hljs-keyword">private</span> FilterConfig filterConfig = <span class="hljs-keyword">null</span>;
<span class="hljs-comment">//设置默认的字符编码</span>
<span class="hljs-keyword">private</span> String defaultCharset = <span class="hljs-string">"UTF-8"</span>;

<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">doFilter</span>(ServletRequest req, ServletResponse resp,
FilterChain chain) <span class="hljs-keyword">throws</span> IOException, ServletException {

HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
String charset = filterConfig.getInitParameter(<span class="hljs-string">"charset"</span>);
<span class="hljs-keyword">if</span>(charset==<span class="hljs-keyword">null</span>){
charset = defaultCharset;
}
request.setCharacterEncoding(charset);
response.setCharacterEncoding(charset);
response.setContentType(<span class="hljs-string">"text/html;charset="</span>+charset);

MyCharacterEncodingRequest requestWrapper = <span class="hljs-keyword">new</span> MyCharacterEncodingRequest(request);
chain.doFilter(requestWrapper, response);
}

<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">init</span>(FilterConfig filterConfig) <span class="hljs-keyword">throws</span> ServletException {
<span class="hljs-comment">//得到过滤器的初始化配置信息</span>
<span class="hljs-keyword">this</span>.filterConfig = filterConfig;
}

<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">destroy</span>() {

}
}

<span class="hljs-comment">/*
1.实现与被增强对象相同的接口
2、定义一个变量记住被增强对象
3、定义一个构造器,接收被增强对象
4、覆盖需要增强的方法
5、对于不想增强的方法,直接调用被增强对象(目标对象)的方法
*/</span>

class MyCharacterEncodingRequest extends HttpServletRequestWrapper{

<span class="hljs-keyword">private</span> HttpServletRequest request;
<span class="hljs-keyword">public</span> <span class="hljs-title">MyCharacterEncodingRequest</span>(HttpServletRequest request) {
<span class="hljs-keyword">super</span>(request);
<span class="hljs-keyword">this</span>.request = request;
}
<span class="hljs-comment">/* 重写getParameter方法
* @see javax.servlet.ServletRequestWrapper#getParameter(java.lang.String)
*/</span>
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">public</span> String <span class="hljs-title">getParameter</span>(String name) {

<span class="hljs-keyword">try</span>{
<span class="hljs-comment">//获取参数的值</span>
String value= <span class="hljs-keyword">this</span>.request.getParameter(name);
<span class="hljs-keyword">if</span>(value==<span class="hljs-keyword">null</span>){
<span class="hljs-keyword">return</span> <span class="hljs-keyword">null</span>;
}
<span class="hljs-comment">//如果不是以get方式提交数据的,就直接返回获取到的值</span>
<span class="hljs-keyword">if</span>(!<span class="hljs-keyword">this</span>.request.getMethod().equalsIgnoreCase(<span class="hljs-string">"get"</span>)) {
<span class="hljs-keyword">return</span> value;
}<span class="hljs-keyword">else</span>{
<span class="hljs-comment">//如果是以get方式提交数据的,就对获取到的值进行转码处理</span>
value = <span class="hljs-keyword">new</span> String(value.getBytes(<span class="hljs-string">"ISO8859-1"</span>),<span class="hljs-keyword">this</span>.request.getCharacterEncoding());
<span class="hljs-keyword">return</span> value;
}
}<span class="hljs-keyword">catch</span> (Exception e) {
<span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> RuntimeException(e);
}
}
}</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li><li>70</li><li>71</li><li>72</li><li>73</li><li>74</li><li>75</li><li>76</li><li>77</li><li>78</li><li>79</li><li>80</li><li>81</li><li>82</li><li>83</li><li>84</li><li>85</li><li>86</li><li>87</li><li>88</li><li>89</li><li>90</li><li>91</li><li>92</li><li>93</li></ul>

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

<code class="hljs xml has-numbering"><span class="hljs-tag"><<span class="hljs-title">filter</span>></span>
<span class="hljs-tag"><<span class="hljs-title">filter-name</span>></span>CharacterEncodingFilter<span class="hljs-tag"></<span class="hljs-title">filter-name</span>></span>
<span class="hljs-tag"><<span class="hljs-title">filter-class</span>></span>me.gacl.web.filter.CharacterEncodingFilter<span class="hljs-tag"></<span class="hljs-title">filter-class</span>></span>
<span class="hljs-tag"><<span class="hljs-title">init-param</span>></span>
<span class="hljs-tag"><<span class="hljs-title">param-name</span>></span>charset<span class="hljs-tag"></<span class="hljs-title">param-name</span>></span>
<span class="hljs-tag"><<span class="hljs-title">param-value</span>></span>UTF-8<span class="hljs-tag"></<span class="hljs-title">param-value</span>></span>
<span class="hljs-tag"></<span class="hljs-title">init-param</span>></span>
<span class="hljs-tag"></<span class="hljs-title">filter</span>></span>

<span class="hljs-tag"><<span class="hljs-title">filter-mapping</span>></span>
<span class="hljs-tag"><<span class="hljs-title">filter-name</span>></span>CharacterEncodingFilter<span class="hljs-tag"></<span class="hljs-title">filter-name</span>></span>
<span class="hljs-tag"><<span class="hljs-title">url-pattern</span>></span>/*<span class="hljs-tag"></<span class="hljs-title">url-pattern</span>></span>
<span class="hljs-tag"></<span class="hljs-title">filter-mapping</span>></span></code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li></ul>

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

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

<code class="hljs avrasm has-numbering">response<span class="hljs-preprocessor">.setDateHeader</span>(<span class="hljs-string">"Expires"</span>,-<span class="hljs-number">1</span>)<span class="hljs-comment">;</span>
response<span class="hljs-preprocessor">.setHeader</span>(<span class="hljs-string">"Cache-Control"</span>,<span class="hljs-string">"no-cache"</span>)<span class="hljs-comment">;</span>
response<span class="hljs-preprocessor">.setHeader</span>(<span class="hljs-string">"Pragma"</span>,<span class="hljs-string">"no-cache"</span>)<span class="hljs-comment">; </span></code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul>

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

Expires数据头:值为GMT时间值,为-1指浏览器不要缓存页面
Cache-Control响应头有两个常用值:
no-cache指浏览器不要缓存当前页面。
max-age:xxx指浏览器缓存页面xxx秒。

<code class="hljs java has-numbering"><span class="hljs-keyword">package</span> me.gacl.web.filter;

<span class="hljs-keyword">import</span> java.io.IOException;

<span class="hljs-keyword">import</span> javax.servlet.Filter;
<span class="hljs-keyword">import</span> javax.servlet.FilterChain;
<span class="hljs-keyword">import</span> javax.servlet.FilterConfig;
<span class="hljs-keyword">import</span> javax.servlet.ServletException;
<span class="hljs-keyword">import</span> javax.servlet.ServletRequest;
<span class="hljs-keyword">import</span> javax.servlet.ServletResponse;
<span class="hljs-keyword">import</span> javax.servlet.http.HttpServletRequest;
<span class="hljs-keyword">import</span> javax.servlet.http.HttpServletResponse;

<span class="hljs-javadoc">/**
*<span class="hljs-javadoctag"> @ClassName</span>: NoCacheFilter
*<span class="hljs-javadoctag"> @Description</span>: 禁止浏览器缓存所有动态页面
*<span class="hljs-javadoctag"> @author</span>: 孤傲苍狼
*<span class="hljs-javadoctag"> @date</span>: 2014-8-31 下午11:25:40
*
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">NoCacheFilter</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Filter</span> {</span>

<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">doFilter</span>(ServletRequest req, ServletResponse resp,
FilterChain chain) <span class="hljs-keyword">throws</span> IOException, ServletException {
<span class="hljs-comment">//把ServletRequest强转成HttpServletRequest</span>
HttpServletRequest request = (HttpServletRequest) req;
<span class="hljs-comment">//把ServletResponse强转成HttpServletResponse</span>
HttpServletResponse response = (HttpServletResponse) resp;
<span class="hljs-comment">//禁止浏览器缓存所有动态页面</span>
response.setDateHeader(<span class="hljs-string">"Expires"</span>, -<span class="hljs-number">1</span>);
response.setHeader(<span class="hljs-string">"Cache-Control"</span>, <span class="hljs-string">"no-cache"</span>);
response.setHeader(<span class="hljs-string">"Pragma"</span>, <span class="hljs-string">"no-cache"</span>);

chain.doFilter(request, response);
}

<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">init</span>(FilterConfig filterConfig) <span class="hljs-keyword">throws</span> ServletException {

}

<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">destroy</span>() {

}
}</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li></ul>

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

<code class="hljs xml has-numbering"><span class="hljs-tag"><<span class="hljs-title">filter</span>></span>
<span class="hljs-tag"><<span class="hljs-title">filter-name</span>></span>NoCacheFilter<span class="hljs-tag"></<span class="hljs-title">filter-name</span>></span>
<span class="hljs-tag"><<span class="hljs-title">filter-class</span>></span>me.gacl.web.filter.NoCacheFilter<span class="hljs-tag"></<span class="hljs-title">filter-class</span>></span>
<span class="hljs-tag"></<span class="hljs-title">filter</span>></span>

<span class="hljs-tag"><<span class="hljs-title">filter-mapping</span>></span>
<span class="hljs-tag"><<span class="hljs-title">filter-name</span>></span>NoCacheFilter<span class="hljs-tag"></<span class="hljs-title">filter-name</span>></span>
<span class="hljs-comment"><!--只拦截Jsp请求--></span>
<span class="hljs-tag"><<span class="hljs-title">servlet-name</span>></span>*.jsp<span class="hljs-tag"></<span class="hljs-title">servlet-name</span>></span>
<span class="hljs-tag"></<span class="hljs-title">filter-mapping</span>></span></code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li></ul>

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

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

<code class="hljs java has-numbering"><span class="hljs-keyword">package</span> me.gacl.web.filter;

<span class="hljs-keyword">import</span> java.io.IOException;

<span class="hljs-keyword">import</span> javax.servlet.Filter;
<span class="hljs-keyword">import</span> javax.servlet.FilterChain;
<span class="hljs-keyword">import</span> javax.servlet.FilterConfig;
<span class="hljs-keyword">import</span> javax.servlet.ServletException;
<span class="hljs-keyword">import</span> javax.servlet.ServletRequest;
<span class="hljs-keyword">import</span> javax.servlet.ServletResponse;
<span class="hljs-keyword">import</span> javax.servlet.http.HttpServletRequest;
<span class="hljs-keyword">import</span> javax.servlet.http.HttpServletResponse;

<span class="hljs-javadoc">/**
*<span class="hljs-javadoctag"> @ClassName</span>: CacheFilter
*<span class="hljs-javadoctag"> @Description</span>: 控制缓存的filter
*<span class="hljs-javadoctag"> @author</span>: 孤傲苍狼
*<span class="hljs-javadoctag"> @date</span>: 2014-9-1 下午9:39:38
*
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">CacheFilter</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Filter</span> {</span>

<span class="hljs-keyword">private</span> FilterConfig filterConfig;

<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">doFilter</span>(ServletRequest req, ServletResponse resp,
FilterChain chain) <span class="hljs-keyword">throws</span> IOException, ServletException {

HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;

<span class="hljs-comment">//1.获取用户想访问的资源</span>
String uri = request.getRequestURI();

<span class="hljs-comment">//2.得到用户想访问的资源的后缀名</span>
String ext = uri.substring(uri.lastIndexOf(<span class="hljs-string">"."</span>)+<span class="hljs-number">1</span>);

<span class="hljs-comment">//得到资源需要缓存的时间</span>
String time = filterConfig.getInitParameter(ext);
<span class="hljs-keyword">if</span>(time!=<span class="hljs-keyword">null</span>){
<span class="hljs-keyword">long</span> t = Long.parseLong(time)*<span class="hljs-number">3600</span>*<span class="hljs-number">1000</span>;
<span class="hljs-comment">//设置缓存</span>
response.setDateHeader(<span class="hljs-string">"expires"</span>, System.currentTimeMillis() + t);
}

chain.doFilter(request, response);

}

<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">init</span>(FilterConfig filterConfig) <span class="hljs-keyword">throws</span> ServletException {
<span class="hljs-keyword">this</span>.filterConfig = filterConfig;
}

<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">destroy</span>() {

}
}</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li></ul>

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

<code class="hljs xml has-numbering"><span class="hljs-comment"><!-- 配置缓存过滤器 --></span>
<span class="hljs-tag"><<span class="hljs-title">filter</span>></span>
<span class="hljs-tag"><<span class="hljs-title">filter-name</span>></span>CacheFilter<span class="hljs-tag"></<span class="hljs-title">filter-name</span>></span>
<span class="hljs-tag"><<span class="hljs-title">filter-class</span>></span>me.gacl.web.filter.CacheFilter<span class="hljs-tag"></<span class="hljs-title">filter-class</span>></span>
<span class="hljs-comment"><!-- 配置要缓存的web资源以及缓存时间,以小时为单位 --></span>
<span class="hljs-tag"><<span class="hljs-title">init-param</span>></span>
<span class="hljs-tag"><<span class="hljs-title">param-name</span>></span>css<span class="hljs-tag"></<span class="hljs-title">param-name</span>></span>
<span class="hljs-tag"><<span class="hljs-title">param-value</span>></span>4<span class="hljs-tag"></<span class="hljs-title">param-value</span>></span>
<span class="hljs-tag"></<span class="hljs-title">init-param</span>></span>
<span class="hljs-tag"><<span class="hljs-title">init-param</span>></span>
<span class="hljs-tag"><<span class="hljs-title">param-name</span>></span>jpg<span class="hljs-tag"></<span class="hljs-title">param-name</span>></span>
<span class="hljs-tag"><<span class="hljs-title">param-value</span>></span>1<span class="hljs-tag"></<span class="hljs-title">param-value</span>></span>
<span class="hljs-tag"></<span class="hljs-title">init-param</span>></span>
<span class="hljs-tag"><<span class="hljs-title">init-param</span>></span>
<span class="hljs-tag"><<span class="hljs-title">param-name</span>></span>js<span class="hljs-tag"></<span class="hljs-title">param-name</span>></span>
<span class="hljs-tag"><<span class="hljs-title">param-value</span>></span>4<span class="hljs-tag"></<span class="hljs-title">param-value</span>></span>
<span class="hljs-tag"></<span class="hljs-title">init-param</span>></span>
<span class="hljs-tag"><<span class="hljs-title">init-param</span>></span>
<span class="hljs-tag"><<span class="hljs-title">param-name</span>></span>png<span class="hljs-tag"></<span class="hljs-title">param-name</span>></span>
<span class="hljs-tag"><<span class="hljs-title">param-value</span>></span>4<span class="hljs-tag"></<span class="hljs-title">param-value</span>></span>
<span class="hljs-tag"></<span class="hljs-title">init-param</span>></span>
<span class="hljs-tag"></<span class="hljs-title">filter</span>></span>
<span class="hljs-comment"><!-- 配置要缓存的web资源的后缀--></span>
<span class="hljs-tag"><<span class="hljs-title">filter-mapping</span>></span>
<span class="hljs-tag"><<span class="hljs-title">filter-name</span>></span>CacheFilter<span class="hljs-tag"></<span class="hljs-title">filter-name</span>></span>
<span class="hljs-tag"><<span class="hljs-title">url-pattern</span>></span>*.jpg<span class="hljs-tag"></<span class="hljs-title">url-pattern</span>></span>
<span class="hljs-tag"></<span class="hljs-title">filter-mapping</span>></span>

<span class="hljs-tag"><<span class="hljs-title">filter-mapping</span>></span>
<span class="hljs-tag"><<span class="hljs-title">filter-name</span>></span>CacheFilter<span class="hljs-tag"></<span class="hljs-title">filter-name</span>></span>
<span class="hljs-tag"><<span class="hljs-title">url-pattern</span>></span>*.css<span class="hljs-tag"></<span class="hljs-title">url-pattern</span>></span>
<span class="hljs-tag"></<span class="hljs-title">filter-mapping</span>></span>

<span class="hljs-tag"><<span class="hljs-title">filter-mapping</span>></span>
<span class="hljs-tag"><<span class="hljs-title">filter-name</span>></span>CacheFilter<span class="hljs-tag"></<span class="hljs-title">filter-name</span>></span>
<span class="hljs-tag"><<span class="hljs-title">url-pattern</span>></span>*.js<span class="hljs-tag"></<span class="hljs-title">url-pattern</span>></span>
<span class="hljs-tag"></<span class="hljs-title">filter-mapping</span>></span>
<span class="hljs-tag"><<span class="hljs-title">filter-mapping</span>></span>
<span class="hljs-tag"><<span class="hljs-title">filter-name</span>></span>CacheFilter<span class="hljs-tag"></<span class="hljs-title">filter-name</span>></span>
<span class="hljs-tag"><<span class="hljs-title">url-pattern</span>></span>*.png<span class="hljs-tag"></<span class="hljs-title">url-pattern</span>></span>
<span class="hljs-tag"></<span class="hljs-title">filter-mapping</span>></span></code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li></ul>

四、实现用户自动登陆

  思路是这样的:

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

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

  核心代码如下:

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

<code class="hljs java has-numbering"><span class="hljs-keyword">package</span> me.gacl.web.controller;

<span class="hljs-keyword">import</span> java.io.IOException;

<span class="hljs-keyword">import</span> javax.servlet.ServletException;
<span class="hljs-keyword">import</span> javax.servlet.http.Cookie;
<span class="hljs-keyword">import</span> javax.servlet.http.HttpServlet;
<span class="hljs-keyword">import</span> javax.servlet.http.HttpServletRequest;
<span class="hljs-keyword">import</span> javax.servlet.http.HttpServletResponse;

<span class="hljs-keyword">import</span> me.gacl.dao.UserDao;
<span class="hljs-keyword">import</span> me.gacl.domain.User;
<span class="hljs-keyword">import</span> me.gacl.util.WebUtils;

<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">LoginServlet</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">HttpServlet</span> {</span>

<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">doGet</span>(HttpServletRequest request, HttpServletResponse response)
<span class="hljs-keyword">throws</span> ServletException, IOException {

String username = request.getParameter(<span class="hljs-string">"username"</span>);
String password = request.getParameter(<span class="hljs-string">"password"</span>);

UserDao dao = <span class="hljs-keyword">new</span> UserDao();
User user = dao.find(username, password);
<span class="hljs-keyword">if</span>(user==<span class="hljs-keyword">null</span>){
request.setAttribute(<span class="hljs-string">"message"</span>, <span class="hljs-string">"用户名或密码不对!!"</span>);
request.getRequestDispatcher(<span class="hljs-string">"/message.jsp"</span>).forward(request, response);
<span class="hljs-keyword">return</span>;
}
request.getSession().setAttribute(<span class="hljs-string">"user"</span>, user);
<span class="hljs-comment">//发送自动登陆cookie给客户端浏览器进行存储</span>
sendAutoLoginCookie(request,response,user);
request.getRequestDispatcher(<span class="hljs-string">"/index.jsp"</span>).forward(request, response);
}

<span class="hljs-javadoc">/**
*<span class="hljs-javadoctag"> @Method</span>: sendAutoLoginCookie
*<span class="hljs-javadoctag"> @Description</span>: 发送自动登录cookie给客户端浏览器
*<span class="hljs-javadoctag"> @Anthor</span>:孤傲苍狼
*
*<span class="hljs-javadoctag"> @param</span> request
*<span class="hljs-javadoctag"> @param</span> response
*<span class="hljs-javadoctag"> @param</span> user
*/</span>
<span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">sendAutoLoginCookie</span>(HttpServletRequest request, HttpServletResponse response, User user) {
<span class="hljs-keyword">if</span> (request.getParameter(<span class="hljs-string">"logintime"</span>)!=<span class="hljs-keyword">null</span>) {
<span class="hljs-keyword">int</span> logintime = Integer.parseInt(request.getParameter(<span class="hljs-string">"logintime"</span>));
<span class="hljs-comment">//创建cookie,cookie的名字是autologin,值是用户登录的用户名和密码,用户名和密码之间使用.进行分割,密码经过md5加密处理</span>
Cookie cookie = <span class="hljs-keyword">new</span> Cookie(<span class="hljs-string">"autologin"</span>,user.getUsername() + <span class="hljs-string">"."</span> + WebUtils.md5(user.getPassword()));
<span class="hljs-comment">//设置cookie的有效期</span>
cookie.setMaxAge(logintime);
<span class="hljs-comment">//设置cookie的有效路径</span>
cookie.setPath(request.getContextPath());
<span class="hljs-comment">//将cookie写入到客户端浏览器</span>
response.addCookie(cookie);
}
}

<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">doPost</span>(HttpServletRequest request, HttpServletResponse response)
<span class="hljs-keyword">throws</span> ServletException, IOException {

doGet(request, response);
}

}</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li></ul>

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

<code class="hljs java has-numbering"><span class="hljs-keyword">package</span> me.gacl.web.filter;

<span class="hljs-keyword">import</span> java.io.IOException;

<span class="hljs-keyword">import</span> javax.servlet.Filter;
<span class="hljs-keyword">import</span> javax.servlet.FilterChain;
<span class="hljs-keyword">import</span> javax.servlet.FilterConfig;
<span class="hljs-keyword">import</span> javax.servlet.ServletException;
<span class="hljs-keyword">import</span> javax.servlet.ServletRequest;
<span class="hljs-keyword">import</span> javax.servlet.ServletResponse;
<span class="hljs-keyword">import</span> javax.servlet.http.Cookie;
<span class="hljs-keyword">import</span> javax.servlet.http.HttpServletRequest;
<span class="hljs-keyword">import</span> javax.servlet.http.HttpServletResponse;

<span class="hljs-keyword">import</span> me.gacl.dao.UserDao;
<span class="hljs-keyword">import</span> me.gacl.domain.User;
<span class="hljs-keyword">import</span> me.gacl.util.WebUtils;

<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">AutoLoginFilter</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Filter</span> {</span>

<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">doFilter</span>(ServletRequest req, ServletResponse resp,
FilterChain chain) <span class="hljs-keyword">throws</span> IOException, ServletException {

HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
<span class="hljs-comment">//如果已经登录了,就直接chain.doFilter(request, response)放行</span>
<span class="hljs-keyword">if</span>(request.getSession().getAttribute(<span class="hljs-string">"user"</span>)!=<span class="hljs-keyword">null</span>){
chain.doFilter(request, response);
<span class="hljs-keyword">return</span>;
}

<span class="hljs-comment">//1.得到用户带过来的authlogin的cookie</span>
String value = <span class="hljs-keyword">null</span>;
Cookie cookies[] = request.getCookies();
<span class="hljs-keyword">for</span>(<span class="hljs-keyword">int</span> i=<span class="hljs-number">0</span>;cookies!=<span class="hljs-keyword">null</span> && i<cookies.length;i++){
<span class="hljs-keyword">if</span>(cookies[i].getName().equals(<span class="hljs-string">"autologin"</span>)){
value = cookies[i].getValue();
}
}

<span class="hljs-comment">//2.得到 cookie中的用户名和密码 </span>
<span class="hljs-keyword">if</span>(value!=<span class="hljs-keyword">null</span>){
String username = value.split(<span class="hljs-string">"\\."</span>)[<span class="hljs-number">0</span>];
String password = value.split(<span class="hljs-string">"\\."</span>)[<span class="hljs-number">1</span>];

<span class="hljs-comment">//3.调用dao获取用户对应的密码</span>
UserDao dao = <span class="hljs-keyword">new</span> UserDao();
User user = dao.find(username);
String dbpassword = user.getPassword();

<span class="hljs-comment">//4.检查用户带过来的md5的密码和数据库中的密码是否匹配,如匹配则自动登陆</span>
<span class="hljs-keyword">if</span>(password.equals(WebUtils.md5(dbpassword))){
request.getSession().setAttribute(<span class="hljs-string">"user"</span>, user);
}
}

chain.doFilter(request, response);
}

<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">destroy</span>() {

}

<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">init</span>(FilterConfig filterConfig) <span class="hljs-keyword">throws</span> ServletException {

}
}</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li></ul>

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

<code class="hljs java has-numbering"><span class="hljs-keyword">package</span> me.gacl.web.controller;

<span class="hljs-keyword">import</span> java.io.IOException;

<span class="hljs-keyword">import</span> javax.servlet.ServletException;
<span class="hljs-keyword">import</span> javax.servlet.http.Cookie;
<span class="hljs-keyword">import</span> javax.servlet.http.HttpServlet;
<span class="hljs-keyword">import</span> javax.servlet.http.HttpServletRequest;
<span class="hljs-keyword">import</span> javax.servlet.http.HttpServletResponse;

<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">CancelAutoLoginServlet</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">HttpServlet</span> {</span>

<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">doGet</span>(HttpServletRequest request, HttpServletResponse response)
<span class="hljs-keyword">throws</span> ServletException, IOException {
<span class="hljs-comment">//移除存储在session中的user</span>
request.getSession().removeAttribute(<span class="hljs-string">"user"</span>);
<span class="hljs-comment">//移除自动登录的cookie</span>
removeAutoLoginCookie(request,response);
<span class="hljs-comment">//注销用户后跳转到登录页面</span>
request.getRequestDispatcher(<span class="hljs-string">"/login.jsp"</span>).forward(request, response);
}

<span class="hljs-javadoc">/**
*<span class="hljs-javadoctag"> @Method</span>: removeAutoLoginCookie
*<span class="hljs-javadoctag"> @Description</span>: 删除自动登录cookie,
*     JavaWeb中删除cookie的方式就是新创建一个cookie,新创建的cookie与要删除的cookie同名,
*     设置新创建的cookie的cookie的有效期设置为0,有效路径与要删除的cookie的有效路径相同
*<span class="hljs-javadoctag"> @Anthor</span>:孤傲苍狼
*
*<span class="hljs-javadoctag"> @param</span> request
*<span class="hljs-javadoctag"> @param</span> response
*/</span>
<span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">removeAutoLoginCookie</span>(HttpServletRequest request, HttpServletResponse response) {
<span class="hljs-comment">//创建一个名字为autologin的cookie</span>
Cookie cookie = <span class="hljs-keyword">new</span> Cookie(<span class="hljs-string">"autologin"</span>,<span class="hljs-string">""</span>);
<span class="hljs-comment">//将cookie的有效期设置为0,命令浏览器删除该cookie</span>
cookie.setMaxAge(<span class="hljs-number">0</span>);
<span class="hljs-comment">//设置要删除的cookie的path</span>
cookie.setPath(request.getContextPath());
response.addCookie(cookie);
}

<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">doPost</span>(HttpServletRequest request, HttpServletResponse response)
<span class="hljs-keyword">throws</span> ServletException, IOException {
doGet(request, response);
}
}</code>

  以上就是过滤器的几个常见应用场景。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: