过滤器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>
以上就是过滤器的几个常见应用场景。
相关文章推荐
- 【转】内核态文件操作--不错
- python zip()函数
- 软件测试管理高级研修班(3天精品班,中国深圳 2016.1.20~22)
- WEB 开发者应该具备的 6 大技能?
- C++,为什么str=new char[strlen(s)+1];中要加一
- Android 项目结构
- Linux下的platform总线驱动(一)
- 【第一节】android增量升级之生成so文件
- linux的sdio驱动编程
- opencv初探(一)——图像遍历的三种操作
- 导航栏标题不居中
- android ListView 几个重要属性
- 注释驱动的 Spring cache 缓存介绍
- ASP.NET获取各级目录Server.MapPath详解全
- 亚马逊一道智力面试题
- 仿途牛导航
- 20160105-收官失误-执白负
- Windows IIS6.1 配置PHP7.0.1
- Java处理GMT时间和UTC时间
- R-CNN和SPP-net