java过滤器(简化认证)
最近在看过滤器,刚刚实现了过滤器的简化认证功能:
使用过滤器简化认证:
在Web应用程序中,过滤器的一个关键用例是保护应用程序不被未授权的用户访问。为跨国部件公司开发的客户支持应用程序使用了一种非常原始的认证机制保护页面。你可能已经注意到应用程序中的许多地方都包含了相同的重复代码,用于检查认证:
if (request.getSession().getAttribute("userName") == null){
response.sendRedirect("login");
return;
}
同时你可能认为认证更简单的方式就是在某个类上创建一个公开静态方法执行该检查,并在所有的地方调用它。确实,这将减少重复代码,但它仍然会导致在多个地方调用该方法的问题。随着应用程序中,Servlet数量的增加,同样也会增加对该静态方法的调用。
所以过滤器对简化认证还是很有用处的,我做了一个小小的demo,思路是,调用listServlet,listServlet中重定向到index.jsp,当然我在webListener中动态配置Filter的时候就是对路径"/index.jsp"页面配置的。所以在跳转到index.jsp页面之前,会执行过滤器中的代码(判断是否已经登录,登录状态允许跳转到index.jsp,非登录状态将重定向到login.jsp让用户登录).
接下来是listServlet(我直接进入这个servlet开启整个demo的测试)
import java.io.IOException; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; @WebServlet(name="listServlet",urlPatterns="/list")
public class listServlet extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L; @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("listServet");
resp.sendRedirect(req.getServletContext().getContextPath() + "/index.jsp");
} @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
}
这是对应的过滤器AuthenticationFilter
import java.io.IOException;
import java.time.Instant; import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; public class AuthenticationFilter implements Filter{ @Override
public void destroy() {
// TODO Auto-generated method stub } @Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {if (req.getAttribute("userName") == null) {
((HttpServletResponse)resp).sendRedirect(req.getServletContext().getContextPath() + "/login.jsp");
}else{
chain.doFilter(req, resp);
}
} @Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub } }
在web监听器中,会配置相应的过滤器
package deep.web.listener; import java.util.Collection; import javax.servlet.FilterRegistration;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener; import deep.web.filter.AuthenticationFilter; @WebListener
public class Configurator implements ServletContextListener{ @Override
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub } @Override
public void contextInitialized(ServletContextEvent event) {
ServletContext context = event.getServletContext(); FilterRegistration.Dynamic registration = context.addFilter("authenticationFilter", new AuthenticationFilter()); registration.setAsyncSupported(true);
System.out.println("contextInitialized"); registration.addMappingForUrlPatterns(null, false, "/index.jsp"); /*这是我测试用的,判断是否配置好了url,并且输出url*/
System.out.println(registration.getUrlPatternMappings().isEmpty());
Collection<String> str = registration.getUrlPatternMappings();
System.out.println(str);
} }
我把loginServlet也粘贴出来吧
package deep.web.controller; import java.io.IOException; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; @WebServlet(name="userServlet",urlPatterns="/user")
public class userServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { }
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("userServlet");
String method= req.getParameter("method");
if (method.equals("login")) {
System.out.println("loginServlet");
String name = req.getParameter("name");
String password = req.getParameter("password");
if (name.equals("test") && password.equals("test")) {
req.getSession().setAttribute("userName","name" );
resp.sendRedirect(req.getServletContext().getContextPath() + "/list.jsp");
}else{
System.out.println("登录失败~");
resp.sendRedirect(req.getServletContext().getContextPath() + "/login.jsp");
}
}
}
}
接下来是输出结果,我会直接进入listServlet→进入过滤器(如果已经登录)→进入index.jsp
→进入过滤器(如果没有登录)→进入login.jsp

采用这种方式的优势在于:如果要修改认证算法,只需要修改过滤器就可以保护应用程序中的资源。之前,你将不得不修改所有的Servlet。
其实不应该用request来认证,应该用session,额,脑瓜子疼...sorry
参考书籍:《Java Web高级编程》
java过滤器(简化认证)的更多相关文章
- java中 SSL认证和keystore使用
java中 SSL认证和keystore使用 2013-10-12 11:08 10488人阅读 评论(0) 收藏 举报 目录(?)[+] 好久没用过SSL认证了,东西久不用,就有点生疏. ...
- Java 过滤器的作用
Servlet API 非常久曾经就已成为企业应用开发的基石,而 Servlet 过滤器则是对 J2EE 家族的相对较新的补充.在 J2EE 探索者 系列文章的最后一篇中,作者 Kyle Gabhar ...
- Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,拦截器Ajax请求
Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,拦截器Ajax请求 >>>>>>>>>>>>>>&g ...
- cookie、session和java过滤器
基础知识理解: cookie.session和过滤器通常都是用在web应用中,cookie和session用来保存一定的数据,过滤器Filter则是在浏览器发出请求之后,而后台执行特定的请求之前发生一 ...
- java过滤器(过滤器排序)
java过滤器(过滤器排序) 定义过滤器顺序是很简单的:匹配请求的过滤器将按照它们出现在部署描述符或者编程式配置中的顺序添加到过滤器链中(记住,如果同时再部署描述符或者编程式配置中设置了一些过滤器,那 ...
- Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,java 判断请求是不是ajax请求
Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,java 判断请求是不是ajax请求 Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,拦截器Ajax请求 java ...
- java 过滤器(理解二)
request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf ...
- java 过滤器(Filter)与springMVC 拦截器(interceptor)的实现案例
java 过滤器Filter: package com.sun.test.aircraft.filter;import javax.servlet.*;import java.io.IOExcepti ...
- 《阿里巴巴编码规范(JAVA)》认证考后感
2018.02.15除夕拿下了阿里云认证的<阿里巴巴编码规范(JAVA)>认证,写下这篇考后感,记录考试中碰到的一些考点. 先总体介绍下这个考试规则,50道选择题,大部分是多选题,有少部分 ...
随机推荐
- docker zabbix
1.zabbix-mysql 数据库 sudo docker pull zabbix/zabbix-server-mysql sudo docker run --name some-zabbix-se ...
- 用java开发dota英雄最华丽的技能
爱java 爱dota,突发奇想想用java开发dota操作最华丽的英雄之一的卡尔的技能,因为本人系小白,代码不足的地方还请包涵,有同样爱好的同学欢迎一起研究学习. 先把我的代码呈上 import ...
- Kali学习笔记36:AVWS10的使用
AVWS是一款商业Web扫描工具 适用于Windows操作系统 功能强大,必须掌握 AVWS11以上是Web形式,AVWS10是桌面应用形式 下载安装破解这些基本操作就不说了,百度即可 从安装好开始: ...
- 项目笔记:2017年(SSM架构)
一.第一部分 前后端分离后的测试工具的使用(Postman): svn先更新再提交,冲突就把自己占位的地方让出,再提交: maven项目也可以用tomcat直接启动: 在mybatis.xml文件中, ...
- Oracle报错#“ORA-01791: 不是 SELECTed 表达式”解决方法
今天遇到一个Oracle报错,写篇博客记录一下 简单看一下下面这个sql,这也查询是没报错的 select a.area_seq, a.area_name from t_unit_area a WHE ...
- vmware中nat模式中使用静态ip后无法上网的问题
在/etc/network/interfaces中添加静态ip auto eth0iface eth0 inet staticaddress 192.168.31.133netmask 255.255 ...
- 阿里巴巴是如何打通 CMDB,实现就近访问的?
CMDB在企业中,一般用于存放与机器设备.应用.服务等相关的元数据.当企业的机器及应用达到一定规模后就需要这样一个系统来存储和管理它们的元数据.有一些广泛使用的属性,例如机器的IP.主机名.机房.应用 ...
- 【spring】aop切面通知,日志处理
1.spring的切面编程 概念原理可以看这里:http://blog.csdn.net/moreevan/article/details/11977115 2.所需要的jar包 maven引入jar ...
- Kubernetes集群搭建之CNI-Flanneld部署篇
本次系列使用的所需部署包版本都使用的目前最新的或最新稳定版,安装包地址请到公众号内回复[K8s实战]获取 Flannel是CoreOS提供用于解决Dokcer集群跨主机通讯的覆盖网络工具.它的主要思路 ...
- Word文档使用密码加密
Word文档使用密码加密 方法如下: 文件-->信息-->保护文档-->用密码进行加密-->设置密码