java图片路径禁止访问权限,java权限拦截,控制当前登录用户访问方法,访问路径,并json提示,驳回请求...

2019独角兽企业重金招聘Python工程师标准>>>

6936d1565ae689371725cdb5fc51c415.png

常用到的springMVC权限拦截器,以前没做过记录,今天在这里重温一下记录配置;

原理:

浏览器发起请求(开始)   >>

进入到拦截方法A >> 进入到Controller某个方法内,且执行代码  >>

进入拦截器方法B >> Controller return 代码执行 >>

进入到拦截器方法C >>

浏览器页面响应(结束)

拦截器: 默认存在三个方法(需继承HandlerInterceptorAdapter类)

方法A: 所有请求之前  preHandle()

方法B: Controller return 之前 postHandle()

方法C: Controller retrrn 之后 afterCompletion()

public class LoginLogInterceptor extends HandlerInterceptorAdapter{

Logger logger = Logger.getLogger(this.getClass());

// 必须要管理员才开操作的api权限 管理员权限,最大

private static final String [] SYSTEMP_URI={"/web/channel/updChannel","/web/channel/delChannel",

"/web/userAccoutNo/addPartner","/web/userAccoutNo/getPageByManager"};

// 次管理权限

private static final String [] PARTNER_URI={"/web/userAccoutNo/getPageByPartner"};

/**

* 最先执行 : 在业务处理器处理请求之前被调用

* 如果返回false

* 从当前的拦截器往回执行所有拦截器的afterCompletion(),再退出拦截器链

* 如果返回true

* 执行下一个拦截器,直到所有的拦截器都执行完毕

* 再执行被拦截的Controller

* 然后进入拦截器链,

* 从最后一个拦截器往回执行所有的postHandle()

* 接着再从最后一个拦截器往回执行所有的afterCompletion()

*/

@Override

public boolean preHandle(HttpServletRequest request,

HttpServletResponse response, Object handler) throws Exception {

String ip = RequestParam.getRealAddress(request);//ip

LoginTicket lt = StaticResouse.getUserSession(request);

logger.info("A 拦截日志......."+lt);

if(lt==null){

ResponseObj obj = new ResponseObj();

obj.setStatus(0);

obj.setShowMessage("请先登录");

response.setHeader("Content-type", "application/json;charset=UTF-8");

response.getWriter().write(obj.getJsonStr());

return false;

}

// 判断操作权限

String currUrl = request.getServletPath();

if (Arrays.binarySearch(SYSTEMP_URI, currUrl)>=0){

// 管理员 小于 10 权限则提示

if(UserLevel.SYSTEM.getCode()>Integer.parseInt(lt.getLevel())){

ResponseObj obj = new ResponseObj();

obj.setStatus(0);

obj.setShowMessage("权限不足");

response.setHeader("Content-type", "application/json;charset=UTF-8");

response.getWriter().write(obj.getJsonStr());

return false;

}

}

if(Arrays.binarySearch(PARTNER_URI, currUrl)>=0){

// 小于 8 权限则提示

if(UserLevel.PARTNER.getCode()>Integer.parseInt(lt.getLevel())){

ResponseObj obj = new ResponseObj();

obj.setStatus(0);

obj.setShowMessage("权限不足");

response.setHeader("Content-type", "application/json;charset=UTF-8");

response.getWriter().write(obj.getJsonStr());

return false;

}

}

return true;

}

/**

* 第二步: 在业务处理器处理请求执行完成后,生成视图之前执行的动作

* 可在modelAndView中加入数据,比如当前时间

*/

@Override

public void postHandle(HttpServletRequest request,

HttpServletResponse response, Object handler,

ModelAndView modelAndView) throws Exception {

logger.info("B拦截日志.......");

}

/**

* 第三步: 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等

*

* 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion()

*/

@Override

public void afterCompletion(HttpServletRequest request,

HttpServletResponse response, Object handler, Exception ex)

throws Exception {

logger.info("C拦截日志.......");

super.afterCompletion(request, response, handler, ex);

}

}

Controller: 控制转发器

存在多个方法,如addMethod,delMothod,getMethod等等, 我们做的是api接口,统一采用返回string方式返回

@RequestMapping(value="/getDetailByChannel",produces="text/html;charset=UTF-8")

@ResponseBody

public String getDetailByChannel(HttpServletRequest request,

HttpServletResponse response,Long chid){

ResponseObj obj = new ResponseObj();

if(chid==null){

obj.setShowMessage("请传入id参数");

return obj.getJsonStr();

}

ChannelInfoModel tempModel = channelService.getDetailByChannel(chid);

obj.setData(tempModel);

return obj.getJsonStr();

}

XML配置

最后返回结果:

aeac8fad590c3e28e3d67ff1239f5d4a.png

好了,结束完毕,注意以上几个技术节点

Arrays.binarySearch(SYSTEMP_URI, currUrl)>=0 : 判断某个字符是否存在字符数组内

UserLevel.SYSTEM.getCode() 枚举式显示用户等级

response.setHeader("Content-type", "application/json;charset=UTF-8");

response.getWriter().write(obj.getJsonStr());   response输出结果值页面

request.getServletPath() 获取当前请求路径, 不包含项目名,仅API接口路径

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是使用axios实现跨域访问拦截*.action请求的基本步骤: 1. 在前端代码中使用axios发送请求时,需要设置`withCredentials: true`,表示允许携带跨域请求的cookie信息。 ```javascript axios.get('http://example.com/api/user.action', { withCredentials: true }) .then(response => { console.log(response.data); }) .catch(error => { console.error(error); }); ``` 2. 在后端服务器中,需要进行跨域访问的设置。以Node.js + Express为例,可以使用`cors`中间件进行设置。 ```javascript const express = require('express'); const cors = require('cors'); const app = express(); app.use(cors({ origin: true, credentials: true, })); app.get('/api/user.action', (req, res) => { // 处理业务逻辑 res.send({ name: 'Alice' }); }); app.listen(3000, () => { console.log('Server is running at http://localhost:3000'); }); ``` 3. 如果需要拦截所有*.action请求,可以使用axios的拦截器功能,对所有请求进行统一的处理。 ```javascript axios.interceptors.request.use(config => { // 判断请求是否为*.action请求 if (/\.action$/.test(config.url)) { // 设置请求头信息 config.headers['X-Requested-With'] = 'XMLHttpRequest'; // 添加请求参数 config.params = { ...config.params, _t: Date.now() }; } return config; }, error => { return Promise.reject(error); }); axios.get('http://example.com/api/user.action', { withCredentials: true }) .then(response => { console.log(response.data); }) .catch(error => { console.error(error); }); ``` 以上是使用axios跨域访问拦截*.action请求的基本步骤。需要注意的是,跨域访问涉及到安全问题,应该谨慎使用,并且在后端服务器中进行严格的访问控制

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值