• Shiro + SSM(框架) + Freemarker(jsp)


    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. "u5F53u524Du7528u6237u6CA1u6709u767Bu5F55uFF01");// 当前用户没有登录!
    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. }

    作者:KeerDi —— 北方的后生

    出处:http://www.cnblogs.com/keerdi/

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    可变长参数列表
    《Android深入透析》之广播(Broadcast)
    android设计模式资源集合
    Android内存性能优化
    Java 对象的生命周期
    Android 打印java堆栈的几种方法
    Android下打印调试堆栈方法
    UML类图几种关系的总结
    【转】Android利用canvas画各种图形(点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形)
    查看Android设备的CPU架构信息
  • 原文地址:https://www.cnblogs.com/123hll/p/7150583.html
Copyright © 2020-2023  润新知