package cn.itcast.elec.util;
import java.io.IOException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.List;
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.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.itcast.elec.domain.ElecUser;
public class SystemFilter implements Filter {
//存放需要放行的连接
List<String> list = new ArrayList<String>();
public void init(FilterConfig config) throws ServletException {
//定义系统在没有Session之前哪些连接需要放行
list.add("/index.jsp");
list.add("/image.jsp");
list.add("/system/elecMenuAction_home.do");
list.add("/error.jsp");
list.add("/system/elecMenuAction_logout.do");
}
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
//获取访问的路径path
String path = request.getServletPath();
//当访问的路径path包含index.jsp的时候,此时从Cookie中获取登录名和密码,并在index.jsp中进行显示,处理记住我的功能
this.forwardIndexPage(path,request);
//使用Session控制系统的粗颗粒度权限控制
//如果访问的路径path包含在定义的连接内,此时都需要放行
if(list.contains(path)){
chain.doFilter(request, response);
return;
}
//从Session中获取当前用户的信息
ElecUser elecUser = (ElecUser) request.getSession().getAttribute("globle_user");
if(elecUser!=null){
//使用页面地址栏输入访问的url,实现细颗粒度权限控制
//从Session中获取当前登录人所能够操作的url
List<String> urlList = (List<String>) request.getSession().getAttribute("globle_url");
if(urlList.contains(path)){
chain.doFilter(request, response);
return;
}
}
//重定向到登录页面
//response.sendRedirect(request.getContextPath()+"/");
//跳转到错误页面,5秒钟后跳转到登录页面(友好)
response.sendRedirect(request.getContextPath()+"/error.jsp");
}
public void destroy() {
}
/**当访问的路径path包含index.jsp的时候,此时从Cookie中获取登录名和密码,并在index.jsp中进行显示,处理记住我的功能*/
private void forwardIndexPage(String path, HttpServletRequest request) {
if(path.contains("/index.jsp")){
String name = "";
String password = "";
String checked = "";
Cookie [] cookies = request.getCookies();
if(cookies!=null && cookies.length>0){
for(int i=0;i<cookies.length;i++){
Cookie cookie = cookies[i];
if(cookie!=null && cookie.getName().equals("name")){
name = cookie.getValue();
//如果name中存在中文的话,对值进行解码
try {
name = URLDecoder.decode(name, "UTF-8");
} catch (Exception e) {
e.printStackTrace();
}
checked = "checked";
}
else if(cookie!=null && cookie.getName().equals("password")){
password = cookie.getValue();
}
}
}
//将3个值放置到request中
request.setAttribute("name", name);
request.setAttribute("password", password);
request.setAttribute("checked", checked);
}
}
}
相关推荐
本资源基于CAS v4版本自定义扩展了 记住密码、验证码、qq、微博等第三方登录功能
在网站开发中,为了增强安全性,常常需要使用验证码来防止自动化的机器人操作,同时为了方便用户,也提供了“记住我”功能,让用户在一定时间内无需重复登录。本教程将详细介绍如何在项目中实现这两个功能。 验证码...
本教程将介绍如何结合Vue.js前端框架、Spring Boot后端框架、Redis缓存服务以及Kaptcha验证码技术,实现一个前后端分离的登录页面验证码功能。这个组合可以提供高效、安全且用户友好的验证机制。 首先,Vue.js是一...
asp.net登录案例,带验证码和记住用户名功能,点击验证码图片可更换验证码
19. **视频验证码**:播放一段简短视频,用户需要记住其中的信息并在输入框中输入。 20. **行为分析验证码**:通过分析用户输入行为,如按键速度、停顿时间等,判断是否为真人。 以上就是20种ASP验证码的概览,每...
验证码是一种用于验证用户身份的安全机制,它通常由一串随机字符组成,图像显示形式常见,目的是...记住,验证码的目的是增加自动化攻击的难度,但不能完全防止,因此还需要结合其他安全措施,如限频、IP 黑名单等。
本主题将深入探讨如何使用SpringSecurity实现表单安全登录、图形验证码的验证、记住我功能的时长控制以及整合第三方登录。 **表单安全登录** 在SpringSecurity中,我们可以方便地配置表单登录。首先,我们需要定义...
记住,验证码的设计应兼顾用户体验和安全性,避免过于复杂导致用户流失,同时防止恶意攻击。在编码过程中,确保遵循最佳实践,例如使用安全的哈希函数存储验证码答案,及时清理会话状态,以及考虑跨站脚本(XSS)和跨...
验证码图像载入后,这里会显示未经滤镜处理的原始验证码...请记住,只能保存一张图片样本。为什么要保存图片样本?因为时间长了,同一个验证码地址的图片样式就可能改变,原来的规则不适用了,如果没有图片样本,我们
4. **session存储**:为了在用户提交验证码后进行验证,服务器需要记住生成的验证码。ASP中常用Session对象来存储会话数据,将验证码值存储在`Session("CheckCode")`中。 5. **用户输入验证**:当用户输入验证码后...
这样,即使用户刷新页面,服务器也能记住已经生成的验证码。 7. **错误处理**:当验证码输入错误时,应向用户返回错误信息,并允许他们重新输入。 以上就是Java实现验证码的完整流程,包括了从生成到验证的每个...
这样可以防止用户记住或截图验证码,增加安全性。 4. **获取图片上的随机数**: 在生成验证码时,我们需要同时保存生成的随机数。当用户输入验证码时,我们可以将输入与保存的随机数进行比对,判断是否输入正确。 ...
通过邮箱验证码,服务提供商能够提供更安全、更可靠的服务,同时也提高了用户体验,因为用户不再需要记住复杂的密码或密钥。然而,这种方法也存在挑战,如垃圾邮件过滤、邮箱被劫持等问题,因此,持续改进验证机制和...
在Android开发中,有时会遇到特定的用户界面需求,例如6位自定义手机验证码输入框。这个场景下,开发者需要创建一个特殊的...记住,良好的用户体验往往源于对细节的关注,而自定义View正是实现这种体验的重要工具。
4. **session管理**:为了验证用户输入的验证码,服务器需要记住生成的验证码。在Java Web中,我们通常使用HttpSession对象来存储与用户会话相关的数据。当用户提交验证码时,服务器会检查session中的值是否与用户...
记住,模拟登录时应尊重网站的使用条款,避免对服务器造成不必要的压力,否则可能会导致IP被封禁。 总的来说,使用C# Winform模拟网站登录涉及网络编程、HTML解析、图像处理和OCR识别等多个领域的知识,需要综合...
4. **存储验证码值**:为了验证用户输入,服务器需要记住生成的验证码。这通常通过在会话(Session)对象中存储字符串来实现,因为会话在用户浏览器关闭前保持状态。 5. **用户交互**:用户看到验证码图像后,需要...
验证码是一种常见的网络安全机制,用于防止自动化程序(如机器人或爬虫)进行非法操作,比如注册、登录、提交...记住,安全是Web开发的重要组成部分,不断更新和优化验证码机制对于抵御日益复杂的网络攻击至关重要。
8. **安全性考虑**:除了基本的验证码功能,登录界面还可能包括其他安全措施,如密码复杂度检查、记住我选项(需谨慎使用以防止长期会话劫持),以及多因素身份验证。 总结来说,这个ASP.NET项目提供了一个既实用又...
RNN可以在处理每个字符的同时记住前面的信息,这对于理解整个验证码至关重要。在实际应用中,我们可能还需要使用双向RNN来同时利用前后文信息。 在训练过程中,我们通常会采用数据增强技术来扩充训练集,如旋转、...