Shiro + SSM(框架) + Freemarker(jsp)讲解的权限控制Demo,还不赶快去下载?

我们知道Ajax不能做页面redirectforward跳转,所以Ajax请求假如没登录,那么这个请求给用户的感觉就是没有任何反应,而用户又不知道用户已经退出或是  Session  超时了。这个时候如何解决?

Shiro 教程,Ajax请求拦截跳转页面方案

在登录拦截器中,如我们自己定义的LoginFilter 中,先行判断下,是否为  Ajax  请求,如果是  Ajax  请求并且没有相关权限,采用Response 输出一段  JSON  数据返回即可。

判断请求是否为Ajax请求

 
  1. /**
  2. * 是否是Ajax请求
  3. * @param request
  4. * @return
  5. */
  6. public static boolean isAjax(ServletRequest request){
  7. String header = ((HttpServletRequest) request).getHeader("X-Requested-With");
  8. if("XMLHttpRequest".equalsIgnoreCase(header)){
  9. LoggerUtils.debug(CLAZZ, "当前请求为Ajax请求");
  10. return Boolean.TRUE;
  11. }
  12. LoggerUtils.debug(CLAZZ, "当前请求非Ajax请求");
  13. return Boolean.FALSE;
  14. }

Response 输出JSON数据

 
  1. /**
  2. * 使用 response 输出JSON
  3. * @param hresponse
  4. * @param resultMap
  5. * @throws IOException
  6. */
  7. public static void out(ServletResponse response, Map<String, String> resultMap){
  8. PrintWriter out = null;
  9. try {
  10. response.setCharacterEncoding("UTF-8");//设置编码
  11. response.setContentType("application/json");//设置返回类型
  12. out = response.getWriter();
  13. out.println(JSONObject.fromObject(resultMap).toString());//输出
  14. } catch (Exception e) {
  15. LoggerUtils.fmtError(CLAZZ, e, "输出JSON报错。");
  16. }finally{
  17. if(null != out){
  18. out.flush();
  19. out.close();
  20. }
  21. }
  22. }

Shiro Filter 判断Ajax 请求并且处理

 
  1. package com.sojson.core.shiro.filter;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import javax.servlet.ServletRequest;
  5. import javax.servlet.ServletResponse;
  6. import org.apache.shiro.web.filter.AccessControlFilter;
  7. import com.sojson.common.model.UUser;
  8. import com.sojson.common.utils.LoggerUtils;
  9. import com.sojson.core.shiro.CustomShiroSessionDAO;
  10. import com.sojson.core.shiro.token.manager.TokenManager;
  11. /**
  12. *
  13. * <p>
  14. * <p>
  15. * 博客地址:http://www.cnblogs.com/123hll/
  16. * <p>
  17. * <p>
  18. *
  19. * 判断登录
  20. *
  21. * <p>
  22. *
  23. * 区分 责任人 日期    说明<br/>
  24. * 创建 Helei 2017年7月2日  <br/>
  25. *
  26. * @author he-lei
  27. * @email helei212@foxmail.com
  28. * @version 1.0,2017年7月2日 <br/>
  29. *
  30. */
  31. public class LoginFilter extends AccessControlFilter {
  32. final static Class<LoginFilter> CLASS = LoginFilter.class;
  33. // session获取
  34. CustomShiroSessionDAO customShiroSessionDAO;
  35. @Override
  36. protected boolean isAccessAllowed(ServletRequest request,
  37. ServletResponse response, Object mappedValue) throws Exception {
  38. UUser token = TokenManager.getToken();
  39. if (null != token || isLoginRequest(request, response)) {// &&// isEnabled()
  40. return Boolean.TRUE;
  41. }
  42. if (ShiroFilterUtils.isAjax(request)) {// ajax请求
  43. Map<String, String> resultMap = new HashMap<String, String>();
  44. LoggerUtils.debug(getClass(), "当前用户没有登录,并且是Ajax请求!");
  45. resultMap.put("login_status", "300");
  46. resultMap.put("message",
  47. "\u5F53\u524D\u7528\u6237\u6CA1\u6709\u767B\u5F55\uFF01");// 当前用户没有登录!
  48. ShiroFilterUtils.out(response, resultMap);
  49. }
  50. return Boolean.FALSE;
  51. }
  52. @Override
  53. protected boolean onAccessDenied(ServletRequest request,
  54. ServletResponse response) throws Exception {
  55. // 保存Request和Response 到登录后的链接
  56. saveRequestAndRedirectToLogin(request, response);
  57. return Boolean.FALSE;
  58. }
  59. public void setCustomShiroSessionDAO(
  60. CustomShiroSessionDAO customShiroSessionDAO) {
  61. this.customShiroSessionDAO = customShiroSessionDAO;
  62. }
  63. }

前端Javascript处理Ajax请求返回值

首先提供一个判断方法:

 
  1. /**
  2. * 判断是否登录,没登录刷新当前页,促使Shiro拦截后跳转登录页
  3. * @param result ajax请求返回的值
  4. * @returns {如果没登录,刷新当前页}
  5. */
  6. function isLogin(result){
  7. if(result && result.login_status && result.login_status == 300){
  8. window.location.reload(true);//刷新当前页
  9. }
  10. return !0;//返回true
  11. }

然后来一个栗子:

 
  1. //改变状态
  2. function changeSessionStatus(sessionIds,status,self){
  3. status = !parseInt(status);
  4. //loading
  5. var load = layer.load();
  6. $.post("${basePath}/member/changeSessionStatus.shtml",{status:status,sessionIds:sessionIds},function(result){
  7. layer.close(load);
  8. if(isLogin(result)){//判断是否登录
  9. if(result && result.status == 200){
  10. return self.text(result.sessionStatusText),
  11. self.attr('status',result.sessionStatus),
  12. self.parent().prev().text(result.sessionStatusTextTd);
  13. layer.msg('操作成功'),!1;
  14. }else{
  15. return layer.msg(result.message,function(){}),!1;
  16. }
  17. }
  18. },'json');
  19. }

Shiro + SSM(框架) + Freemarker(jsp)的更多相关文章

  1. ssm框架使用jsp提交表单到controller

    jsp代码: controller代码:

  2. (原创)ssm sql 例子(freemarker+jsp)

    ssm整合地址:http://www.cnblogs.com/xiaohuihui96/p/6104351.html 接下讲解一个插入语句的流程和顺带讲解freemarker+jsp视图的整合 初次接 ...

  3. shiro权限控制(一):shiro介绍以及整合SSM框架

    shiro安全框架是目前为止作为登录注册最常用的框架,因为它十分的强大简单,提供了认证.授权.加密和会话管理等功能 . shiro能做什么? 认证:验证用户的身份 授权:对用户执行访问控制:判断用户是 ...

  4. ssm框架与shiro的整合小demo,用idea开发+maven管理

    shiro安全框架是目前为止作为登录注册最常用的框架,因为它十分的强大简单,提供了认证.授权.加密和会话管理等功能 . shiro能做什么? 认证:验证用户的身份 授权:对用户执行访问控制:判断用户是 ...

  5. shiro系列三、ssm框架整合shiro实现权限控制

    shiro权限框架是一个非常优秀的框架,前面的几篇文章对shiro进行了非常详细的介绍和原理分析,那么接下来让我们开始在web项目中使用它(javase也能用shiro): 一.数据库表结构设计 二. ...

  6. [JSP]Maven+SSM框架(Spring+SpringMVC+MyBatis) - Hello World

    来源:http://blog.csdn.net/zhshulin/article/details/37956105?utm_source=tuicool&utm_medium=referral ...

  7. 百度富文本编辑器ueditor在jsp中的使用(ssm框架中的应用)

    折腾了一下午终于把百度富文本编辑器ueditor搞定了!   项目地址:https://github.com/724888/lightnote_new     首先我参考了一个ueditor的demo ...

  8. SSM框架之批量增加示例(同步请求jsp视图解析)

    准备环境:SSM框架+JDK8/JDK7+MySQL5.7+MAVEN3以上+Tomcat8/7应用服务器 示例说明: 分发给用户优惠券,通过checkbox选中批量分发,对应也就是批量增加. 对于公 ...

  9. java官网门户源码 SSM框架 自适应-响应式 freemarker 静态模版引擎

    来源:http://www.fhadmin.org/webnewsdetail3.html 前台:支持(5+1[时尚单页风格])六套模版,可以在后台切换 官网:www.fhadmin.org 系统介绍 ...

随机推荐

  1. <Three.js>(第一节)环境搭建

    Three.js顾名思义3D的js库.是运行在浏览器的基于webgl的3D引擎.该引擎是github上的一个开源项目,下载地址:https://github.com/mrdoob/three.js/ ...

  2. 如何用Java实现反转排序

    摘要:反转排序是将原先已经排序好了的重新排序,是原来的数组元素的顺序反转过来.假设原来的数组顺序是{6,5,4,3,2,1},反转之后的顺序就是{1,2,3,4,5,6}.这个排序的算法不是很难,代码 ...

  3. HDU 1240 Asteroids!【BFS】

    题意:给出一个三维的空间,给出起点和终点,问是否能够到达终点 和上一题一样,只不过这一题的坐标是zxy输入的, 因为题目中说的是接下来的n行中分别是由n*n的矩形组成的,所以第一个n该是Z坐标,n*n ...

  4. JDBC连接SQL Server遇到的问题

    需要使用到微软的JDBC sql server的驱动类,去官网下载jar包 使用的URL模式:"jdbc:sqlserver:地址:端口//;databaseName=YourDatabas ...

  5. perl JSON模块使用

    简介: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 它基于JavaScript(Standard ECMA-262 3rd Edition - De ...

  6. 【Round #36 (Div. 2 only) C】Socks Pairs

    [题目链接]:https://csacademy.com/contest/round-36/task/socks-pairs/ [题意] 给你n种颜色的袜子,每种颜色颜色的袜子有ai只; 假设你在取袜 ...

  7. Win7下JDK环境变量设置批处理(转)

    每次重装系统之后,都需要重新设置JDK环境变量 项目中有些入门小白看了网络上的设置环境变量的文章还是会设置错环境变量 提供一个批处理能够在Win7下运行(使用了setx命令),自动设置环境变量. cl ...

  8. js获取css

    原帖地址:http://kingphp.blog.163.com/blog/static/20042324420120109438458/ 我们通过dom.style获得的属性是有限制的,只能获取ht ...

  9. Kinect for Windows V2 SDK+ VS2012 环境搭建

    眼下使用的SDK版本号是KinectSDK-v2.0-PublicPreview1409-Setup.exe. 下载地址:http://www.microsoft.com/en-us/download ...

  10. 怎样在HP-UX中安装bash?

     怎样在HP-UX中安装bash? 注:HPUX全称是Hewlett Packard UniX是惠普9000系列server的Unix操作系统,能够在HP的PA-RISC处理器.Intel的Ita ...