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道选择题,大部分是多选题,有少部分 ...
随机推荐
- 删除坏掉的 Active Directory Domain
最近公司的某个 Domain Controller 报告可能由于长时间没在线,同步失败,然后用 Repldiag 工具清理 lingering objects 的过程中,该工具报告存在 serious ...
- Apache Sentry部署
三台hadoop集群,分别是master.slave1和slave2.下面是这三台机器的软件分布: master:NameNode.ZK.HiveMetaSotre.HiveServer2.Sentr ...
- Javascript高级编程学习笔记(49)—— DOM2和DOM3(1)DOM变化
DOM变化 我们知道DOM有许多的版本,其中DOM0和DOM2这两个级别以对事件的纳入标准而为人所知 但是呢,这里不讲事件,在后面会有专门和事件有关的部分作为详细讲解 这里就只讲一下DOM2和DOM3 ...
- CCS3怎么实现border边框渐变效果
下图注册按钮的边框有渐变效果,如果让你来实现,你会怎么做呢 个人觉得,省事的做法,直接让UI给背景图片就可以了,如下图 不过这种做法感觉不太灵活,如果要修改border的渐变颜色,就需要UI重新做图. ...
- Mybatis框架七:三种方式整合Spring
需要的jar包: 新建lib文件夹放入jar包,Build Path-->Add To Build Path之后: 原始Dao开发示例: src下:新建核心配置文件sqlMapConfig.xm ...
- 简单读!spring-mvc源码之穿越http请求
相信spring-mvc这种被玩坏了的架构理念,大家都烂熟于胸了,不过还是想来扒一扒他的细节. 一个http请求,怎么样被 spring 接收,又怎样做出响应呢? 一般地,我们会配置一个 web.xm ...
- knn算法的c语言实现
最近研究KNN,找到了一些优秀的源码,贴出来,做个笔记吧. #include<stdio.h> #include<stdlib.h> #include<math.h> ...
- 9102年了,汇总下HttpClient问题,封印一个
如果找的是core的HttpClientFactory 出门右转. 官方写法,高并发下,TCP连接不能快速释放,导致端口占完,无法连接 Dispose 不是马上关闭tcp连接 主动关闭的一方为什么不能 ...
- 全网最详细的最新稳定OSSEC搭建部署(ossec-server(CentOS7.X)和ossec-agent(CentOS7.X))(图文详解)
不多说,直接上干货! 前言 写在前面的话,网上能够找到一些关于ossec方面的资料,虽然很少,但是总比没有强,不过在实际的使用过程中还是会碰到许多稀奇古怪的问题.整理整理我的使用过程,就当做一篇笔记吧 ...
- Mybatis 源码简述
转载请注明来自:http://www.cnblogs.com/xmzJava/p/8578399.html 日常开发中,mybatis如果报错了调错起来会比较麻烦,因为一层套着一层,如果没有对myba ...