JavaEE学习笔记之Servlet/JSP(5)
来源:互联网 发布:淘宝改类目影响排名吗 编辑:程序博客网 时间:2024/05/30 04:44
这里列出在Servlet中常用的几种过滤器:
一、字符编码的过滤器
/** * 字符编码的过滤器 用于设置 HTTP 请求字符编码的过滤器,通过过滤器参数encoding指明使用何种字符编码,用于处理HtmlForm请求参数的中文问题 */public class CharacterEncodingFilter implements Filter { private FilterConfig config = null; private String defaultCharset = "utf-8"; public CharacterEncodingFilter() { // TODO Auto-generated constructor stub } /** * @see Filter#destroy() */ public void destroy() { this.config = null; this.defaultCharset = null; } /** * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) */ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse resp = (HttpServletResponse) response; String charset = config.getInitParameter("encoding"); if (charset == null) { charset = defaultCharset; } request.setCharacterEncoding(charset); // 有时候response不用设置编码,因为servlet一般不做输出, // 输出交由jsp来做,所以只要jsp页面设定编码即可 request.setCharacterEncoding(charset); resp.setContentType("text/html;charset=" + charset); chain.doFilter(req, resp); } /** * @see Filter#init(FilterConfig) */ public void init(FilterConfig fConfig) throws ServletException { this.config = fConfig; }}
web.xml
<filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>com.briup.day03.CharacterEncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
二、禁止缓存所有动态页面的过滤器
a) 有 3 个 HTTP 响应头字段都可以禁止浏览器缓存当前页面,它们在 Servlet 中的示例代码如下:
response.setDateHeader("Expires",-1); response.setHeader("Cache-Control","no-cache"); response.setHeader("Pragma","no-cache");
b) 并不是所有的浏览器都能完全支持上面的三个响应头,因此最好是同时使用上面的三个响应头。
c) Expires数据头:值为GMT时间值,为-1指浏览器不要缓存页面
d) Cache-Control响应头有两个常用值:
no-cache指浏览器不要缓存当前页面。 max-age:xxx指浏览器缓存页面xxx秒
/** * 用于使 Browser 不缓存页面的过滤器 */public class NoCacheFilter implements Filter { public NoCacheFilter() { } public void destroy() { } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) resp; response.setDateHeader("expires", -1); response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma", "no-cache"); chain.doFilter(request, response); } public void init(FilterConfig fConfig) throws ServletException { }}
web.xml
<filter> <filter-name>noCacheFilter</filter-name> <filter-class>com.briup.day03.NoCacheFilter</filter-class> </filter> <filter-mapping> <filter-name>noCacheFilter</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping> <filter-mapping> <filter-name>noCacheFilter</filter-name> <url-pattern>/servlet/*</url-pattern> </filter-mapping>
可以设置多个filter-mapping来映射不同的文件类型
测试:
提交表单数据,返回,查看表单中的数据是否仍然存在
三、防止用户未登录访问的过滤器
我们可能经常会用到这一功能,比如有时,我们不希望用户没有进行登录访问后台的操作页面,而且这样的非法访问会让系统极为的不安全,所以我们常常需要进行登录才授权访问其它页面,否则只会出现登录页面,当然我的思路:
一种是在jsp页面进行session的判断,如果不存在该用户的session,就跳转到登录页面,否则执行jsp页面代码,但是你会发现这样做逻辑也简单,但是非常麻烦,如果有很多个jsp,那么就要写多个判断
另一种则是利用过滤器,访问页面时都进行过滤验证,如果存在该用户session,则访问该页面,否则跳转到登陆页面登录,保存session后访问其它页面
public class LoginFilter implements Filter { public static final String login_page = "/test/admin/index.jsp"; public static final String logout_page = "/test/admin/Public/login.jsp"; @Override public void destroy() { System.out.println("OneFilter 销毁。。。"); } @Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) resp; String requestURI = request.getRequestURI(); String cxtPath = request.getContextPath(); //除掉项目名称时访问页面当前路径 String targerURL = requestURI.substring(cxtPath.length()); HttpSession session = request.getSession(false); //对当前页面进行判断,如果当前页面不为登录页面 if (!("/admin/Public/login.jsp".equals(targerURL))) { //在不是登陆页面时,再进行判断,如果不是登陆页面也没有session则跳转到登录页面, if(session == null || session.getAttribute("admin") == null){ response.sendRedirect(logout_page); return; }else { //这里表示正确,会去寻找下一个链,如果不存在,则进行正常的页面跳转 chain.doFilter(request, response); return; } }else { //这里表示如果当前页面是登陆页面,跳转到登陆页面 chain.doFilter(request, response); return; } } @Override public void init(FilterConfig arg0) throws ServletException { System.out.println("OneFilter 初始化。。。"); }}
web.xml
<filter> <filter-name>LoginFilter</filter-name> <filter-class>com.test.filter.LoginFilter</filter-class></filter><filter-mapping> <filter-name>LoginFilter</filter-name> //这里表示对所有的以jsp后缀的文件有效,其它的无效 <url-pattern>*.jsp</url-pattern></filter-mapping>
2 1
- JavaEE学习笔记之Servlet/JSP(5)
- JavaEE学习笔记之Servlet/JSP(2)
- JavaEE学习笔记之Servlet/JSP(3)
- JavaEE学习笔记之Servlet/JSP(4)
- JavaEE学习笔记之Servlet/JSP(6)
- JavaEE学习笔记之Servlet/JSP(1)
- JavaEE学习笔记之Servlet/JSP—EL表达式
- JavaEE学习笔记之Servlet
- JavaEE学习笔记分享之初识JSP
- JavaEE之Servlet&JSP篇
- 【JavaEE笔记】JSP学习
- 【JavaEE】jsp学习笔记
- jsp学习笔记之servlet
- javaee之jsp和Servlet的练习
- 【JavaEE】jsp学习笔记之el技术和jstl
- JavaEE学习笔记分享之初识JavaEE
- 【JavaEE】javaEE学习笔记之事物
- JSP/Servlet学习笔记
- java画图面板
- Qt经典—线程、事件与Qobject
- Unity的拍照功能
- LeetCode 371. Sum of Two Integers
- 用钩子机制实现键盘监听---键盘监听器
- JavaEE学习笔记之Servlet/JSP(5)
- 【Python学习笔记】python高级特性:切片
- 【训练题】强连通分量缩点
- 重建二叉树
- Qt 读取 XML 文档
- 分布式系统设计系列 -- 基本原理及高可用策略
- 布隆过滤器原理和例子
- Base64 编码/解码器
- 第一节 Memcached分布式缓存入门