炎冰

炎冰 查看完整档案

重庆编辑重庆邮电大学  |  自动化 编辑重庆长安汽车股份有限公司  |  技术 编辑 beeant0512.github.io/ 编辑
编辑
_ | |__ _ _ __ _ | '_ \| | | |/ _` | | |_) | |_| | (_| | |_.__/ \__,_|\__, | |___/ 个人简介什么都没有

个人动态

炎冰 赞了文章 · 2017-11-28

解决spring security自定义filter重复执行问题

本文讲一个spring security自定义filter非常容易出现的一个问题,那就是filter被执行两遍。

复现

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Bean
    public DemoFilter demoFilter(){
        return new DemoFilter();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .addFilterBefore(demoFilter(),AnonymousAuthenticationFilter.class)
                .authorizeRequests()
                .antMatchers("/login","/css/**", "/js/**","/fonts/**").permitAll()
                .anyRequest().authenticated();
    }
}

其中DemoFilter如下

public class DemoFilter extends GenericFilterBean {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //do something
        filterChain.doFilter(servletRequest, servletResponse);
    }
}

原因

在spring容器托管的GenericFilterBean的bean,都会自动加入到servlet的filter chain,而上面的定义,还额外把filter加入到了spring security的
AnonymousAuthenticationFilter之前。而spring security也是一系列的filter,在mvc的filter之前执行。因此在鉴权通过的情况下,就会先后各执行一次。

解决方案

方案1

不把filter托管给spring,直接new,比如

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .addFilterBefore(new DemoFilter(),AnonymousAuthenticationFilter.class)
                .authorizeRequests()
                .antMatchers("/login","/css/**", "/js/**","/fonts/**").permitAll()
                .anyRequest().authenticated();
    }
}

方案2

有时候filter需要访问spring容器的资源,托管给容器可能好些,那么这个时候,就可以像FilterSecurityInterceptor做个标记FILTER_APPLIED

public class DemoFilter extends GenericFilterBean {

    private static final String FILTER_APPLIED = "__spring_security_demoFilter_filterApplied";

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        if (servletRequest.getAttribute(FILTER_APPLIED) != null) {
            filterChain.doFilter(servletRequest, servletResponse);
            return ;
        }
        //do something
        servletRequest.setAttribute(FILTER_APPLIED,true);
        filterChain.doFilter(servletRequest, servletResponse);
    }
}

doc

查看原文

赞 4 收藏 5 评论 5

炎冰 提出了问题 · 2017-10-06

uxcore 如何设置全局的natty-fetch

在实际使用中发现,uxcore使用的是natty-fetch进行ajax的数据请求,例如在表格组件中 配置了fetchUrl,就会使用natty-fetch进行表格的数据请求。 请问如何配置全局的natty-fetch默认配置。

尝试过

nattyFetch.setGlobal({
    // 配置整个项目所有接口的参数中都包含`__token`字段
    data: {
        __token: 'project_token_string'
    }
});

但是貌似不起作用。

关注 3 回答 1

炎冰 提出了问题 · 2017-10-01

uxcore tree table怎么异步加载数据

uxcore的table组件支持tree table,但是给的示例上是把一棵树的全部数据加载完才能展现,对于数据量大的业务场景来说这样的消耗是很大的,请问该如何实现树的异步加载?即首次加载一级根数据,点击后再加载子级数据

关注 3 回答 2

炎冰 提出了问题 · 2017-09-12

请问谁有 uxcore 的 kuma字体,谢谢分享。

官方开源了uxcore,但是却没开放字体,这个就很尴尬了。

关注 1 回答 0

炎冰 回答了问题 · 2017-08-22

解决请问 在uxcore中 如何更新validate的状态和错误Msg

handleClick else

let codeToField = {

2: 'usr',
1: 'pwd'

};

_this.setState({

errMsg: res.body.msg,
isDirty: true,
field: codeToField[res.body.code]

}, () => {

_this.form.doValidate();

})

// 必须设置state isDirty false 否则 在改变input值时会一直提示这个错误
_this.setState({

errMsg: '',
isDirty: false,
field: codeToField[res.body.code],
submit: false,

})

Form:

<Form ref={this.saveRef('form')} className="login-form">

<Input jsxname="usr" jsxlabel="用户名" autoTrim="true" jsxplaceholder="请输入用户名"
       required={true}
       jsxrules={[
           {validator: Validators.isNotEmpty, errMsg: "用户名不能为空"},
           {
               validator: (value) => {
                   if (this.state.field === 'usr' && this.state.isDirty) {
                       return false;
                   }
                   return true
               }, errMsg: this.state.errMsg
           }]}/>
<Input jsxname="pwd" jsxlabel="密码" inputType="password" autoTrim="true"
       jsxplaceholder="请输入密码"
       required={true}
       jsxrules={[
           {validator: Validators.isNotEmpty, errMsg: "密码不能为空"},
           {
               validator: (value) => {
                   if (this.state.field === 'pwd' && this.state.isDirty) {
                       return false;
                   }
                   return true
               }, errMsg: this.state.errMsg
           }]}/>
<Other>
    <Button style={{marginLeft: '88px'}} onClick={this.handleClick}>登录</Button>
</Other>

</Form>

关注 2 回答 2

炎冰 提出了问题 · 2017-08-11

解决请问 在uxcore中 如何更新validate的状态和错误Msg

例如在登录的时候,提交表单后后端返回用户名或密码错误的消息,在前端怎么更新到对应的input验证错误消息上

constructor(props) {

super(props);
this.state = {};

this.handleClick = this.handleClick.bind(this);

}

saveRef(refName) {

const me = this;
return (c) => {
    me[refName] = c;
};

}

handleClick() {

let _this = this;
let formValues = this.form.getValues();
if (formValues.pass) {
    Request
        .post(ctp + '/login')
        .type('form')
        .send(formValues.values)
        .set('X-CSRF-TOKEN', csrf)
        .end(function (err, res) {
            if (err) {
                //do something
            } else {
                // if (1 == res.body.code) {
               //  例如: 密码错误, 该怎么把错误消息给pwd input
                // 此处该如何写,才能够使 pwd input 验证失效
                // }
            }
        })
}

}

render() {

let me = this;
return (
    <div className="kuma-container-full">
        <div className="login">
            <style>
                {".required {font-family:Simsun} " +
                ".login-form {width: 532px;width: 532px;margin: auto;top: 100px;position: relative;}"}
            </style>
            <Form ref={this.saveRef('form')} className="login-form" instantValidate={false}>
                <Input jsxname="usr" jsxlabel="用户名" autoTrim="true" jsxplaceholder="请输入用户名"
                       required={true}
                       jsxrules={[
                           {validator: Validators.isNotEmpty, errMsg: "用户名不能为空"}]}/>
                <Input jsxname="pwd" jsxlabel="密码" inputType="password" autoTrim="true"
                       jsxplaceholder="请输入密码"
                       required={true}
                       jsxrules={[
                           {validator: Validators.isNotEmpty, errMsg: "密码不能为空"}]}/>
                <Other>
                    <Button style={{marginLeft: '88px'}} onClick={this.handleClick}>登录</Button>
                </Other>
            </Form>
        </div>
    </div>
)

}

关注 2 回答 2

炎冰 关注了标签 · 2017-08-11

uxcore

uxcore 是专注于企业系统的 React PC UI 组件库,兼容chrome/safari/Safari/IE8+

关注 17

认证与成就

  • 获得 0 次点赞
  • 获得 5 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 5 枚铜徽章

擅长技能
编辑

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2017-08-11
个人主页被 384 人浏览