SSM项目+Ajax前后端请求获取不到Session的问题,Session为什么获取不到呢

总结

虽然面试套路众多,但对于技术面试来说,主要还是考察一个人的技术能力和沟通能力。不同类型的面试官根据自身的理解问的问题也不尽相同,没有规律可循。

上面提到的关于这些JAVA基础、三大框架、项目经验、并发编程、JVM及调优、网络、设计模式、spring+mybatis源码解读、Mysql调优、分布式监控、消息队列、分布式存储等等面试题笔记及资料

有些面试官喜欢问自己擅长的问题,比如在实际编程中遇到的或者他自己一直在琢磨的这方面的问题,还有些面试官,尤其是大厂的比如 BAT 的面试官喜欢问面试者认为自己擅长的,然后通过提问的方式深挖细节,刨根到底。

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

问题重现

=======================================================================

在这里插入图片描述

login.jsp

在这里插入图片描述

当登录成功后进行跳转至首页

我想,问题就出在这里,

花了很长时间终于找到,因为请求路径中写了全路径,这个写了全路径,会去刷新页面,和后端不是一个域名下,我想那就是这个的问题,所以把前面一串子前路经去掉,只留下${APP_PATH}以及后面的路径,结果如下图

在这里插入图片描述

问题完美解决,不要写全路径访问页面,因为本项目是基于jsp,且只写项目名以及后面的路径访问即可

因为写上后与本项目会清除session中的数据,所以,只写相对路径即可

如果你觉得博主写的不错的话,不妨给个一键三连,点击下方小拳头即可一键三连。

分享

首先分享一份学习大纲,内容较多,涵盖了互联网行业所有的流行以及核心技术,以截图形式分享:

(亿级流量性能调优实战+一线大厂分布式实战+架构师筑基必备技能+设计思想开源框架解读+性能直线提升架构技术+高效存储让项目性能起飞+分布式扩展到微服务架构…实在是太多了)

其次分享一些技术知识,以截图形式分享一部分:

Tomcat架构解析:

算法训练+高分宝典:

Spring Cloud+Docker微服务实战:

最后分享一波面试资料:

切莫死记硬背,小心面试官直接让你出门右拐

1000道互联网Java面试题:

Java高级架构面试知识整理:

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

57acb)收录**

需要这份系统化的资料的朋友,可以点击这里获取

  • 23
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于SSM+Shiro+Ajax+MD5的登录的详细代码: 1. 前端页面代码 login.jsp ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>登录</title> <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script> </head> <body> <h1>登录</h1> <form id="loginForm"> <div> <label>用户名:</label> <input type="text" name="username" required> </div> <div> <label>密码:</label> <input type="password" name="password" required> </div> <div> <label>验证码:</label> <input type="text" name="captcha" required> <img id="captchaImg" src="/captcha.jpg" alt="验证码" onclick="this.src='/captcha.jpg?'+Math.random()"> </div> <div> <input type="submit" value="登录"> </div> </form> <script> $(function() { $('#loginForm').submit(function(event) { event.preventDefault(); var formData = $(this).serialize(); $.ajax({ url: '/login', type: 'POST', data: formData, dataType: 'json', success: function(result) { if (result.success) { window.location.href = '/home'; } else { alert(result.message); $('#captchaImg').click(); } }, error: function() { alert('服务器错误,请稍后再试!'); } }); }); }); </script> </body> </html> ``` 2. 后端代码 UserController.java ```java @Controller public class UserController { @Autowired private UserService userService; @RequestMapping("/login") @ResponseBody public Result login(@RequestParam("username") String username, @RequestParam("password") String password, @RequestParam("captcha") String captcha, HttpSession session) { // 验证码校验 String realCaptcha = (String) session.getAttribute("captcha"); if (!captcha.equalsIgnoreCase(realCaptcha)) { return new Result("验证码错误!", false); } // 用户名密码校验 User user = userService.findByUsername(username); if (user == null) { return new Result("用户不存在!", false); } String md5Password = MD5Util.md5(password, user.getSalt()); if (!md5Password.equals(user.getPassword())) { return new Result("密码错误!", false); } // 登录成功,将用户信息保存到Sessionsession.setAttribute("user", user); return new Result("登录成功!", true); } } ``` UserService.java ```java @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public User findByUsername(String username) { return userMapper.findByUsername(username); } } ``` UserMapper.xml ```xml <mapper namespace="com.example.mapper.UserMapper"> <select id="findByUsername" parameterType="java.lang.String" resultType="com.example.entity.User"> select * from user where username=#{username} </select> </mapper> ``` UserMapper.java ```java public interface UserMapper { User findByUsername(String username); } ``` MD5Util.java ```java public class MD5Util { public static String md5(String str, String salt) { try { MessageDigest md5 = MessageDigest.getInstance("MD5"); byte[] bytes = md5.digest((str + salt).getBytes("utf-8")); StringBuilder sb = new StringBuilder(); for (byte b : bytes) { String hex = Integer.toHexString(b & 0xff); if (hex.length() == 1) { sb.append("0"); } sb.append(hex); } return sb.toString(); } catch (Exception e) { throw new RuntimeException(e); } } } ``` ShiroConfig.java ```java @Configuration public class ShiroConfig { @Autowired private UserService userService; @Bean public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) { ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); shiroFilterFactoryBean.setSecurityManager(securityManager); shiroFilterFactoryBean.setLoginUrl("/login"); shiroFilterFactoryBean.setUnauthorizedUrl("/403"); Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>(); filterChainDefinitionMap.put("/login", "anon"); filterChainDefinitionMap.put("/logout", "logout"); filterChainDefinitionMap.put("/**", "authc"); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); return shiroFilterFactoryBean; } @Bean public SecurityManager securityManager() { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(realm()); return securityManager; } @Bean public UserRealm realm() { UserRealm realm = new UserRealm(); realm.setCredentialsMatcher(credentialsMatcher()); return realm; } @Bean public HashedCredentialsMatcher credentialsMatcher() { HashedCredentialsMatcher credentialsMatcher = new HashedCredentialsMatcher(); credentialsMatcher.setHashAlgorithmName("MD5"); credentialsMatcher.setHashIterations(1); return credentialsMatcher; } public class UserRealm extends AuthorizingRealm { @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); return authorizationInfo; } @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { UsernamePasswordToken upToken = (UsernamePasswordToken) token; String username = upToken.getUsername(); User user = userService.findByUsername(username); if (user == null) { throw new UnknownAccountException("用户不存在!"); } SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(), ByteSource.Util.bytes(user.getSalt()), getName()); return authenticationInfo; } } } ``` 3. 实体类代码 User.java ```java public class User implements Serializable { private Long id; private String username; private String password; private String salt; // getter/setter方法省略 } ``` 4. 配置文件代码 application.properties ```properties server.port=8080 spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.jdbc.Driver mybatis.mapper-locations=classpath:mapper/*.xml mybatis.type-aliases-package=com.example.entity shiro.loginUrl=/login ``` 以上是基于SSM+Shiro+Ajax+MD5的登录的详细代码,其中包括了前端页面代码、后端代码、实体类代码和配置文件代码。该代码实现了基本的登录功能,包括了用户名密码校验、验证码校验、MD5加密等功能。可以根据需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值