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道选择题,大部分是多选题,有少部分 ...
随机推荐
- 微信支付接口调用H5(C#)
H5支付是指商户在微信客户端外的移动端网页展示商品或服务,用户在前述页面确认使用微信支付时,商户发起本服务呼起微信客户端进行支付.主要用于触屏版的手机浏览器请求微信支付的场景.可以方便的从外部浏览器唤 ...
- entity.Database.SqlQuery() 和entity.Database.SqlCommand()
原文地址: http://msdn.microsoft.com/en-us/library/gg715124(v=vs.103) 使用 EF 4.1 或者更新版本, 你可以直接执行任何数据库命令. 在 ...
- 修复运行 tasklist 命令时提示 ERROR: Not found
最近碰到了一个脚本运行 tasklist 总是提示 ERROR: Not found,在这里找到了修复的方法 https://superuser.com/questions/1282867/windo ...
- 【高速接口-RapidIO】6、Xilinx RapidIO核仿真与包时序分析
提示:本文的所有图片如果不清晰,请在浏览器的新建标签中打开或保存到本地打开 一.软件平台与硬件平台 软件平台: 操作系统:Windows 8.1 64-bit 开发套件:Vivado2015.4.2 ...
- Player 播放器开源项目总结
Android开发中,我们不免会遇到播放器相关开发的需求,以下是本人之前star的开源项目,供大家参考: 一.NBPlayer 项目地址:https://github.com/renhui/NBPla ...
- [Postman]授权(11)
授权过程将验证您是否有权从服务器访问所需的数据.发送请求时,通常必须包含参数以确保请求具有访问权限并返回所需数据.Postman提供的授权类型使您可以轻松处理Postman本机应用程序中的身份验证协议 ...
- 向github提交代码不用输入帐号密码
解决方案:方案一: 在你的用户目录下新建一个文本文件.git-credentials Windows:C:/Users/username Mac OS X: /Users/username Linux ...
- git gc和fsck的用法
一.保证git良好的性能 在大的仓库中, git靠压缩历史信息来节约磁盘和内存空间. 压缩操作并不是自动进行的, 你需要手动执行 git gc: $ git gc 压缩操作比较耗时, 你运行git g ...
- 性能瓶颈之Target
最常见的性能问题都发生在向目标数据库写数据的时候 常见的与目标数据库性能有关的问题有: 1) 数据库的checkpoint间隔太小 2) 数据库网络包太小 3) 在进行大批量数据加载时的问题 ...
- app测试之专项测试
专项测试包含很多东西,安装.升级.卸载.性能.安全.网络.随机等等,这些都属于专项测试 一个app的正常到用户手里使用,功能是最基础的测试,专项测试测试主要的. 下面介绍一些常用的专项测试: 1.多任 ...